Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 3 如何在ASP.NET MVC3中保持服务器调用之间的DropDownList值_Asp.net Mvc 3_Viewstate_Html.dropdownlistfor - Fatal编程技术网

Asp.net mvc 3 如何在ASP.NET MVC3中保持服务器调用之间的DropDownList值

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(

我有一个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()
           });
       }
    } 
}
我用一个
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);
}