DropDownListFor<>如果我在调用之前在模型中更改它,则不使用我选择的值

本文关键字:选择 如果 调用 DropDownListFor 模型 | 更新日期: 2023-09-27 18:32:12

为什么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();" })

DropDownListFor<>如果我在调用之前在模型中更改它,则不使用我选择的值

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

您可以通过在操作中清除模型状态来防止这种情况。

[HttpPost]
public ActionResult SomeAction()
{
    ModelState.Clear();
    //return View(model); 
}
相关文章: