EnumDropDownListFor 不选择值,尽管值被传递给视图

Tom*_*ght 1 asp.net-mvc enums razor

童话般的例行情况,我需要允许用户从 ASP.NET MVC 应用程序中的 Enum 中选择一个值。由于我使用的是 MVC 5.2 版,因此我可以简单地执行以下操作:

// Model
public MyEnum EnumVal { get; set; }

// Controller
return View(new MyModel{EnumVal = MyEnum.SomeVal});

// View
@Html.EnumDropDownListFor(model => model.EnumVal)
Run Code Online (Sandbox Code Playgroud)

这一切都神奇地起作用了。我已经做了足够多的时间来认为这是理所当然的。

但我刚刚注意到我传递的值没有被选为下拉菜单的当前值。

我可以吐出模型的内容来验证该值是否被正确传递,但下拉菜单只选择了第一个值。

其他答案(例如这里和这里)似乎证实了我认为我知道的:我不需要做任何额外的事情来让下拉菜单选择我通过的值。

我有脑放屁吗?为什么这不起作用?


更新

这是控制器方法的更完整列表:

public ActionResult Create(string enumVal)
{
    var valueToPass = AccountsDestination.QbDUk;
    Enum.TryParse(enumVal, out valueToPass);
    return View(new QuickBooksMappingViewModel(){EnumVal = valueToPass});
}
Run Code Online (Sandbox Code Playgroud)

小智 5

问题是您的方法有一个参数enumVal(与您的模型属性同名)。当方法执行时,DefaultModelBinder将参数的值添加到ModelState。

在视图中,该EnumDropDownListFor()方法首先检查匹配项ModelState(然后是ViewData您的模型值),它找到并尝试将选择选项设置为 中的值ModelState。有关为什么这是默认行为的解释,请参阅TextBoxFor 显示初始值,而不是从 code 更新的值。

在您的情况下,参数的值要么是第一个选项的值,要么与任何选项值都不匹配(并且选择了第一个选项,因为必须有某些内容)。

要么更改参数的名称,使其与您的模型属性之一不同,要么您可以使用ModelState.Clear();从ModelState.