2012-11-30 95 views
0

我有一個ASP.NET MVC3應用程序。我有以下ViewModel如何在ASP.NET MVC3服務器調用之間保留DropDownList值

public class MyViewModel 
{ 
    public string Year { get; set; } 
    public string Month {get; set; } 

    public IEnumerable<SelectListItem> Years 
    { 
     get 
     { 
      return Enumerable.Range(2000, DateTime.Now.Year - 2000).Select(x => new SelectListItem 
      { 
       Value = x.ToString(), 
       Text = x.ToString() 
      }); 
     } 
    } 
} 

而下面View

@model MyNamespace.MyViewModel 

@Html.DropDownListFor(
     x => x.Year, 
    new SelectList(Model.Years, "Value", "Text"), 
    "-- select year --" 
) 

@Html.DropDownListFor(
     x => x.Month, 
    Enumerable.Empty<SelectListItem>(), 
    "-- select month --" 
) 

我填的是DropDownListMonthjQuery功能被觸發從DropDownListonchangeYear,它完美的作品。當表單被髮布到服務器,然後視圖被回顯時,我想將值保存在'Month'DropDownList中,因爲它正確地爲Year發生。因此,我試過(除了jQuery腳本):

public class MyViewModel 
{ 
    public string Year { get; set; } 
    public string Month {get; set; } 

    public IEnumerable<SelectListItem> Months 
    { 
     get 
     { 
      if(Year != null) 
      { 
       return Enumerable.Range(1, 12).Select(x => new SelectListItem 
       { 
        Value = x.ToString(), 
        Text = x.ToString() 
       }); 
      } 
     } 
    } 

而在View

@Html.DropDownListFor(
      x => x.Month, 
     new SelectList(Model.Months, "Value", "Text"), 
     "-- select month --" 
    ) 

我留下了歲月的代碼,以使事情更短。此代碼在第一次運行時會拋出NullReferenceException,因爲IEnumerable爲空。我怎樣才能實現我的目標?

+0

只是一個小問題,爲什麼你打算根據今年的變化事件填充月份?只是好奇,因爲它似乎你想同時填充兩個。 – IyaTaisho

+0

@IyaTaisho,我正在創建一個應用程序來顯示統計信息,而且我也用相同的邏輯來填充日子。我也想阻止用戶選擇一個月而不選擇年份 – CiccioMiami

回答

3

您必須重新填充動作中的月份列表。 POST是無狀態的,不像asp.net webforms。 只是做在你的代碼是這樣的:

public ViewResult MyAction(MyViewModel model) 
{ 
    if (ModelState.IsValid) 
    { 
     //.. do your stuff ... 
     //return redirect to index if everything went ok 
    } 

    //something went wrong return the model 
    model.Years = new SelectList(/* code to populate years */, "Value", "Text", Model.Year); 
    model.Months = new SelectList(/* code to populate months */, "Value", "Text", Model.Month); 
} 

作爲一個方面說明我更喜歡使用SelectList代替IEnumerable<SelectListItem>怎麼一回事,因爲我可以在控制器設置的默認值(更適合在我看來控制器責任)而不是在視圖中。

+0

謝謝,但是如何解決NullReferenceException問題在Views Months爲空時出現? – CiccioMiami

+0

正如我在答覆中所述,您必須重新填充動作中的月份,否則它將始終爲空。該視圖不會在通話後保持任何狀態。 – Iridio

相關問題