Ich konvertiere meine Denkweise und Programmierung von Webforms zu MVC3. Für die Aufzeichnung tut es mir weh.Können Daten über die Indexansicht mithilfe von Schaltflächen aktualisiert werden?
Also mache ich einen Kalender, der eine Monatsansicht hat (die Seite zeigt nur die Tage und Ereignisse für diesen Monat). Ich setze zwei Knöpfe Previous und Next, um von Monat zu Monat zu gehen. In Webforms würde jede Änderung nur in Calendar.aspx stattfinden. Allerdings scheint es , dass ich zwei ActionResults (beide HttpPost) machen muss. Man geht zu einer vorherigen Ansicht und einer weiteren zu einer nächsten Ansicht. Nur um den gleichen Effekt zu erzielen. Ich hatte gehofft, nur den Kalender auf dem Index ActionResult/View zu aktualisieren, aber ich sehe nicht, wie man das macht. Meine Indexansicht ist unten.
Kurz gesagt, gibt es eine Möglichkeit, den Kalender zu aktualisieren und zur Indexansicht zurückzukehren? Oder muss ich zwei weitere Ansichten (Previous und Next) machen, um den neuen Monat anzuzeigen, wenn ich die entsprechenden Tasten (Previous und Next) drücke?
@model HTMLMVCCalendar.Models.MonthModel
@{
ViewBag.Title = "Home Page";
int month = Model.Month;
int year = Model.Year;
int numberOfDays = DateTime.DaysInMonth(year, month);
int startDay = (int)(Convert.ToDateTime(month + "/1/" + year).DayOfWeek);
int startCount = 1;
}
<h2>@ViewBag.Message</h2>
<p>
To learn more about ASP.NET MVC visit <a href="http://asp.net/mvc" title="ASP.NET MVC Website">http://asp.net/mvc</a>.
</p>
<div>
<table id="calendar">
<thead>
<tr>
<th id="monthHeader" colspan="7">
<h3>
@{
@Convert.ToDateTime(month + "/1/" + year).ToString("MMMM");
}
</h3>
</th>
</tr>
<tr>
<th>Sun</th>
<th>Mon</th>
<th>Tues</th>
<th>Wed</th>
<th>Thur</th>
<th>Fri</th>
<th>Sat</th>
</tr>
</thead>
<tbody>
<tr>
@for (int i = 0; i < startDay; ++i)
{
@:<td><div><span> </span></div><div><span> </span></div></td>
}
@for (int j = startDay; j < ((numberOfDays + startDay) + 1); ++j)
{
<td>
<div><span>@startCount</span></div>
<div>
<span>
@{
var todaysEvents = Model.AllDays.ToList().FindAll(d => d.CalDate.Day == startCount);
foreach(HTMLMVCCalendar.Models.CalendarModel eventsToday in todaysEvents)
{
foreach(HTMLMVCCalendar.Models.EventModel eventToday in eventsToday.CalEvents)
{
<text>
@eventToday.DayCode:<br />
@eventToday.Subject:<br />
@eventToday.EventDesc<br /><br />
</text>
}
}
}
</span>
</div>
</td>
if ((j + 1) % 7 == 0)
{
@:</tr><tr>
}
++startCount;
}
</tr>
</tbody>
</table>
<div>
<input id="previous" type="submit" value="submit" />
<input id="next" type="submit" value="submit" />
</div>
</div>
UPDATE: Ich habe das versucht, und ich denke, es sollte funktionieren. Nicht sicher warum nicht?
<div>
@using (Html.BeginForm("Previous", "Home"))
{
<input id="previous" type="submit" value="Previous" />
}
@using (Html.BeginForm("Next", "Home"))
{
<input id="next" type="submit" value="Next" />
}
</div>
public ActionResult Index()
{
ViewBag.Message = "Welcome to ASP.NET MVC!";
int month;
int year;
int.TryParse(ViewBag.Year, out year);
int.TryParse(ViewBag.Month, out month);
Calendar monthEventsCal = new Calendar();
HTMLMVCCalendar.Models.MonthModel allMonthEvents = monthEventsCal.monthEvents(year, month);
return View("Index", allMonthEvents);
}
[HttpPost]
public ActionResult Previous(HTMLMVCCalendar.Models.MonthModel prevMonth)
{
Calendar monthEventsCal = new Calendar();
var newMonth = monthEventsCal.previousMonth(prevMonth.Year, prevMonth.Month);
ViewBag.Month = newMonth.Item2;
ViewBag.Year = newMonth.Item1;
return RedirectToAction("Index");
}
[HttpPost]
public ActionResult Next(HTMLMVCCalendar.Models.MonthModel nextMonth)
{
Calendar monthEventsCal = new Calendar();
var newMonth = monthEventsCal.nextMonth(nextMonth.Year, nextMonth.Month);
ViewBag.Month = newMonth.Item2;
ViewBag.Year = newMonth.Item1;
return RedirectToAction("Index");
}
Ich erkannte meinen Fehler. Ich muss wirklich aus der Webforms-Mentalität herauskommen. Pfui. Hinweis zu self (again): Razor-Werte verlassen den Bereich, sobald die Seite zum Browser gerendert wurde. – dotnetN00b
Frage String oder versteckte Etiketten zur Rettung! – dotnetN00b
ViewBag-Daten sind nach RedirectToActions verloren. Wenn Sie es so machen, würde ich TempData verwenden. Alternativ dazu können Sie sowohl den vorherigen als auch den nächsten Beitrag zum Index haben, bestimmen, welche Schaltfläche gedrückt wurde, und dann zur Aktion "Index erhalten" umleiten, bei der Sie den neuen Monat übergeben. – DMulligan