我的模型如下:
[Required]
[Display(Name = "Email address:")]
public string Email { get; set; }
public string ExternalIdEmail { get; set; }
在我看来:
@Html.LabelFor(m => m.Email)
@Html.TextBoxFor(m => m.Email)
在进入视图时,我仔细检查,并确认@ Model.Email是空字符串,但输入文本框始终使用ExternalIdEmail的默认值进行渲染!
我的行动是:
public ActionResult action(string email)
{
return View(new actionlModel() { ExternalIdEmail = email, Email = "" });
}
看起来m.Email
正在获取操作参数email
中包含的值。如果我改为:
public ActionResult action(string emailX) { ...
然后它正常工作。
这是设计吗?
答案 0 :(得分:1)
这是设计:
Html帮助器方法更倾向于使用ModelState
而不是实际的模型值。您可以在此处详细了解:ASP.NET MVC Postbacks and HtmlHelper Controls ignoring Model Changes
因为ModelState
在您的操作中填充了不同的值提供程序(表单字段,路由数据,QueryString等),ModelState
将包含email
属性的值,这在调用Html.TextBoxFor(m => m.Email)
要解决此问题(除了您已经注意到的重命名参数旁边),您只需要清除ModelState
。
如果您不想“重新使用”任何内容,只需致电Clear()
public ActionResult action(string email)
{
ModelState.Clear();
return View(new actionlModel() { ExternalIdEmail = email, Email = "" });
}
或者您可以通过调用Remove
的单个属性的值来清除:
public ActionResult action(string email)
{
ModelState.Remove("email");
return View(new actionlModel() { ExternalIdEmail = email, Email = "" });
}