ASP.NET MVC验证 - 澄清验证消息

时间:2012-08-25 13:05:18

标签: asp.net-mvc validation

考虑这个模型类:

public class FooModel {
     public Person Manager { get; set; }
     public Person Employee { get; set; }
}

public class Person {
     [Required]
     public String Name { get; set; }
}

如果用户在Manager的表单中提供Name值而不是Employee,那么ValidationSummary()将返回消息“Name is required”而不进一步限定它(即它不是清楚Employee.Name未设置,Manager.Name是。)

这个问题有什么解决方案?

1 个答案:

答案 0 :(得分:0)

这里的问题:( How do I show a different Required message to instances of the same object in MVC3?)有两个答案。

第一个建议展平ViewModel,在我的情况下,这意味着将Person成员复制到FooModel两次,然后我可以为两者设置自定义验证消息。我出于显而易见的原因决定反对这一点(我的Person类相当复杂,并且在其他地方使用过。)

第二个答案建议修改ModelState的错误消息,这就是我所做的。我已经为ViewModels开发了一种修改自己验证的方法,所以添加这个技巧很容易。我添加了一个[DisplayName]属性,如此(psuedocode):

class FooModel : ICustomValidation {
    [DisplayName("Manager")]
    public Person Manager { get; set; }
    [DisplayName("Employee")]
    public Person Employee { get; set; }

    public void HandleValidation(ModelStateDictionary modelState) {
        if( modelState.IsInvalidByPrefix("Manager") ) {
            modelState.AppendErrorMessageDisplayPrefix( GetLocalisedDisplayName("Manager") );
        }

if(modelState.IsInvalidByPrefix(“Employee”)){                 modelState.AppendErrorMessageDisplayPrefix(GetLocalisedDisplayName(“Employee”));             }         }     }