Model属性填充了另一个类似名称的属性

时间:2013-09-21 14:59:07

标签: c# asp.net-mvc asp.net-mvc-4

我的模型如下:

[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) { ...

然后它正常工作。

这是设计吗?

1 个答案:

答案 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 = "" });
}