我有一个 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}}为空。我怎样才能实现目标?
答案 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>
因为我可以在控制器中设置默认值(在我看来更适合控制器的责任)而不是在视图中