1

为什么不DropDownListFor<>总是设置选定的值?

就我而言,我注意到在表单发布后构建下拉列表并且值与提交的值不同时会发生这种情况。

因此,该场景是一个包含下拉列表的表单,用于选择您想要查看的类别。当您提交此内容时,下拉列表将作为结果的一部分重新构建,并预选为您选择的下拉列表。

但是,如果控制器操作更改了已发布的值,然后将该修改后的模型传递给视图,则模型中的值将被忽略,并且不会将任何选项设置为选中状态。

即使您构造DropDownListFor<>以专门设置所选值,也不会将任何选项设置为选中。

当您在进入视图之前不更改模型中提交的值时,您只需要以下内容:

@Html.DropDownListFor(m => m.Selection.CategoryId,
                           new SelectList(Model.Categories.Select(c => new SelectListItem { Value = c.Id, Text = c.Name + " (" + c.Id + ")" }), "Value", "Text"),  
                            "All",                             
                            new { onchange = "this.form.submit();" })

但是存在问题(修改控制器操作中提交的值),即使以下专门设置所选选项的方法也不起作用:

@Html.DropDownListFor(m => m.Selection.CategoryId,
                           new SelectList(Model.Categories.Select(c => new SelectListItem { Value = c.Id, Text = c.Name + " (" + c.Id + ")" }), "Value", "Text", Model.Selection.CategoryId),  
                            "All",                             
                            new { onchange = "this.form.submit();" })

@Html.DropDownListFor(m => m.Selection.CategoryId,
                           new SelectList(Model.Categories.Select(c => new SelectListItem { Value = c.Id, Text = c.Name + " (" + c.Id + ")", Selected = c.Id == Model.Selection.CategoryId }), "Value", "Text"),  
                            "All",                             
                            new { onchange = "this.form.submit();" })
4

1 回答 1

3

这不是关于DropDownListFor方法,而是关于模型绑定。当您在 POST 请求后返回另一个视图时,ASP.NET MVC 认为验证失败并使用以前的值进行模型绑定。您可以在此博客文章中阅读有关此行为的更多信息。

您可以通过在操作中清除 ModelState 来防止这种情况。

[HttpPost]
public ActionResult SomeAction()
{
    ModelState.Clear();
    //return View(model); 
}
于 2013-09-21T21:28:17.757 回答