2012-04-12 1 views
1

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>&nbsp;</span></div><div><span>&nbsp;</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> 
              &nbsp;@eventToday.DayCode:<br /> 
              &nbsp;@eventToday.Subject:<br /> 
              &nbsp;@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" /> 
     &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
     <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" /> 
     } 
     &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
     @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"); 
} 
+0

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

+0

Frage String oder versteckte Etiketten zur Rettung! – dotnetN00b

+0

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

Antwort

0

Es gibt ein paar Möglichkeiten, dies zu tun, ist die einfachste nur einen Ajax-Aufruf tun und Sie die Ansicht mit den zurückgegebenen Daten aktualisieren http://bob-the-janitor.blogspot.com/2010/12/easy-ajax-with-aspnet-mvc-and-jquery.html , wenn Sie Lust bekommen möchten, können Sie auch eine Ansicht von der Rückkehr ajax-Aufruf und ersetzen Sie aktuelle Ansicht wie hier gezeigt http://bob-the-janitor.blogspot.com/2011/11/more-ajax-with-mvc-using-partial-views.html

1

Empfohlene mögliche Art und Weise zu tun, es

public virtual ActionResult Index(int? month) 
{ 
    int relativeMonth = 0; 
    if(month.HasValue) 
     relativeMonth = month.Value; 

    //Create ViewModel fetching calender data using relativeMonth value. 
    //For example if relativeMonth is 0 fetch current month view model. 
    //If relative month is -3 fetch calendar data from three months ago. 

    if(Request..IsAjaxRequest()) //Optional. If you want ajax. 
     return PartialView("Calendar", model); 

    return View(model); 
} 

Mit dieser Methode Ihren nächsten und und früheren aber tons sind jetzt Links, wo Previous auf relatedMonth - 1 und next auf relatedMonth + 1 verweist. Ich denke nicht, dass das Erstellen von Posts notwendig ist, da Sie eigentlich keine Formulardaten übermitteln (mit dieser Methode, die ich als nächstes und vorher machen würde) Links, die wie Buttons aussehen).

Wenn Sie ajax aktivieren möchten, würde ich Ihre Kalenderansicht in einem separaten cshtml stecken und es als Teilansicht in index.cshtml aufrufen.

+0

Ich nehme es in diesem Monat und Model sind eigentlich die gleichen? – dotnetN00b

+0

@ dotnetN00b Monat in meinem Code ist eine optionale Ganzzahl, die den gewünschten relativen Monat in Bezug auf das aktuelle Datum enthalten könnte. Das Modell wäre eine Initiierung Ihres HTMLMVCCalendar.Models.MonthModel, in dem Sie die Variable "month" verwenden, um sicherzustellen, dass Sie die richtige Variable erstellen. – DMulligan

+0

Ich versuche es jetzt einfach zu halten, also brauche ich keinen Ajax. Allerdings, nachdem ich in den letzten Tagen meinen Kopf geschlagen hatte. Ich sehe, wohin du damit gehst. Ich habe jedoch zwei Fragen. Einer, warum das virtuelle Schlüsselwort? Zwei, die Monatsvariable wird von den Routen oder der Querystring übergeben? Oder etwas anderes? – dotnetN00b