ASP.NET MVC:当我手动访问Modelstate.AddModelError时,文本框不会突出显示

Ric*_*d77 2 asp.net-mvc

假设我有这个属性

[Required(ErrorMessage = "Add this property")]
public string MyProperty {get; set;}
Run Code Online (Sandbox Code Playgroud)

当我像这样使用模型绑定验证时

UpdateModel(myModel);
Run Code Online (Sandbox Code Playgroud)

然后,当出现错误时,将重新显示表单,并突出显示代表MyProperty的文本框(即红色边框和粉红色背景).所述Html.ValidateMessageFor()显示也错误旁边的文本框的消息.

但是,当我手动完成时,就像这样

if(string.NullOrEmpty(myModel.MyProperty))
  ModelState.AddModelError("MyProperty", "Custom message");
Run Code Online (Sandbox Code Playgroud)

如果出现错误,我仍然会收到错误消息.但只有Html.ValidationSummary())在页面顶部显示错误列表.但texbox不再突出显示,Html.ValidateMessageFor()根本不显示任何内容.

我能做些什么来解决这个问题吗?

谢谢你的帮助.

Ric*_*d77 5

经过2天没有回答,我怀疑我没有以正确的方式提出这个问题.所以,我问得不同,得到了答案.如果有人遇到同样的问题,我会回答这个问题.

整个事情是当模型是复合模型时没有为键添加前缀.例如,在我的情况下:

public class FormViewModel
{
  public OrganizationData organizationData { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

而OrganizationData的定义是

public class OrganizationData
{
  public string OrganizationName { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

所以我应该这样做

if(string.NullOrEmpty(formViewModel.organizationData.OrganizationName))
   ModelState.AddModelError("organizationData.OrganizationName", "Name can't be empty")
Run Code Online (Sandbox Code Playgroud)

但是,我省略了前缀 organizationData,而是做了

ModelState.AddModelError("OrganizationName", "Name can't be empty")
Run Code Online (Sandbox Code Playgroud)

在视图中,Html帮助器将检查ModelState以了解是否存在与其密钥关联的错误.所以,如果那是cae,它会凸显自己.在这种情况下,organizationData.OrganizationNameOrganizationName是不同的.因此文本框不会突出显示自己.

还有一件事.我没有尝试使用TryUpdateModel(),因为它不仅在内部使用AddModelError(),而且还使用可以找出正确密钥的算法.

我想我上了课.通过了解这种机制,我能够解决其他一些悬而未决的问题.

感谢Darin Dimitrov和Ian Galloway.