Asp.net mvc 3 如何在ASP.NET MVC3中保持服务器调用之间的DropDownList值
我有一个ASP.NET MVC3应用程序。我有以下Asp.net mvc 3 如何在ASP.NET MVC3中保持服务器调用之间的DropDownList值,asp.net-mvc-3,viewstate,html.dropdownlistfor,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(
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()
});
}
}
}
我用一个jQuery
函数填充DropDownList
的Month
的DropDownList
,该函数在年的DropDownList
更改时触发,效果非常好。当表单被发布到服务器,然后视图被渲染回来时,我希望在'Month'下拉列表中保留值,因为它在年
中正确发生。因此我尝试了(除了jQuery脚本):
为了缩短时间,我在代码中省略了很多年。此代码在第一次运行时抛出NullReferenceException
,因为IEnumerable
为空。如何实现我的目标?您必须在行动中重新填充月份列表。
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
,因为我可以在控制器中设置默认值(我认为这更适合控制器的职责),而不是在视图中设置默认值。您必须在操作中重新填充月份列表。
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
,因为我可以在控制器中设置默认值(我认为这更适合控制器的职责),而不是在视图中设置默认值。只是一个小问题,为什么您要费心根据一年的变化事件填充月份?只是好奇,因为你似乎想同时填充这两个数据。@IyaTaisho,我正在创建一个应用程序来显示统计数据,我也用同样的逻辑填充天数。我还想阻止用户选择月份而不选择年份的选项只是一个小问题,为什么您要费心根据年份的变化事件填充月份?只是好奇,因为你似乎想同时填充这两个数据。@IyaTaisho,我正在创建一个应用程序来显示统计数据,我也用同样的逻辑填充天数。我还想阻止用户选择月份而不选择年份的选项谢谢,但是当月份为空时,如何解决视图中的NullReferenceException问题?正如我在回答中所述,您必须在操作中重新填充月份,否则它将始终为空。视图在post call之间不存在任何状态。谢谢,但是,当月份为空时,如何解决视图中的NullReferenceException问题?正如我在回答中所述,您必须在操作中重新填充月份,否则它将始终为空。视图不会在post调用之间保留任何状态。
@Html.DropDownListFor(
x => x.Month,
new SelectList(Model.Months, "Value", "Text"),
"-- select month --"
)
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);
}