1

我的模型如下:

[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正在获取 action 参数中包含的值email。如果我将其更改为:

    public ActionResult action(string emailX) { ...

然后它可以正常工作。

这是设计使然吗?

4

1 回答 1

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 = "" });
}
于 2014-01-03T13:05:02.417 回答