0

我有一个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 --"
)

我用一个从for触发的函数填充DropDownListfor ,该函数运行良好。当表单发布到服务器然后返回视图时,我想将值保留在“月份”DropDownList 中,因为它正确地发生在. 因此我尝试了(除了 jQuery 脚本):MonthjQueryonchangeDropDownListYearYear

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

我在代码中留下了 Years 以使事情更短。此代码在第一次运行时抛出 aNullReferenceException因为IEnumerable是空的。我怎样才能实现我的目标?

4

1 回答 1

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>因为我可以在控制器中设置默认值(我认为更适合控制器职责)而不是在视图中。

于 2012-11-30T13:20:13.360 回答