如何在ASP.NET MVC3中的服务器调用之间保留DropDownList值

时间:2012-11-30 12:52:48

标签: asp.net-mvc-3 viewstate html.dropdownlistfor

我有一个 ASP.NET MVC3 应用程序。我有以下ViewModel

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 --"
)

我为DropDownList填充Month jQuery函数,onchange来自DropDownList Year Year 。当表单发布到服务器然后呈现视图时,我想将值保留在'Month'DownDownList中,因为它正确地发生在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() }); } } } 。因此我尝试了(除了jQuery脚本):

View

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

NullReferenceException

我将代码中的几年缩短了。此代码在第一次运行时抛出IEnumerable,因为{{1}}为空。我怎样才能实现目标?

1 个答案:

答案 0 :(得分: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>因为我可以在控制器中设置默认值(在我看来更适合控制器的责任)而不是在视图中