假设我有这个属性
[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()根本不显示任何内容.
我能做些什么来解决这个问题吗?
谢谢你的帮助.
经过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.OrganizationName和OrganizationName是不同的.因此文本框不会突出显示自己.
还有一件事.我没有尝试使用TryUpdateModel(),因为它不仅在内部使用AddModelError(),而且还使用可以找出正确密钥的算法.
我想我上了课.通过了解这种机制,我能够解决其他一些悬而未决的问题.
感谢Darin Dimitrov和Ian Galloway.
| 归档时间: |
|
| 查看次数: |
1899 次 |
| 最近记录: |