使用基于输入的不同验证逻辑(ASP.NET MVC)

时间:2016-04-05 07:12:41

标签: asp.net-mvc

我们有客户要求构建可在多个品牌中重复使用的网络应用。数据结构将保持不变,但某些用例可能需要某些字段,而不是其他字段。

例如,假设我们有一个表单来捕获基本PII,视图模型如下所示:

public class UserViewModel 
{
    public string FirstName {get;set;}
    public string LastName {get;set;}
    public string Email {get;set;}
    public string Gender {get;set;}
}

例如,基于路线数据参数,验证规则可能不同。所以我真的不想将规则硬编码为验证属性。我想过使用一个单独的验证器接口并在字典中查找正确的验证器......

public ActionResult DoSomething(UserViewModel model) 
{
    var offer = RouteData.Values["offer"];        
    var validator = validators.ContainsKey(offer) 
        ? validators[offer] : dict["default"];

    validator.Validate(model, ModelState);

    if (ModelState.IsValid) 
    {
        // etc...
    }
}

这种条件验证是否有更简洁的方法?

编辑:我不是在寻找第三方图书馆推荐人员。我正在寻找关于构建验证的建议尽可能灵活。

2 个答案:

答案 0 :(得分:1)

你可以尝试一下非常好FluentValidation library的优秀integration with ASP.NET MVC。它将允许您处理所需的验证逻辑。

验证逻辑与您的模型分开,可以是unit tested in isolation

答案 1 :(得分:1)

在您的视图模式上,您可以从IValidatableObject命名空间中的System.ComponentModel.DataAnnotations继承,然后使用Validate方法根据特定条件检查验证。

即。

public class UserViewModel : IValidatableObject
{
    public string FirstName {get;set;}
    public string LastName {get;set;}
    public string Email {get;set;}
    public string Gender {get;set;}

    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) {
        if(string.IsNullOrWhiteSpace(FirstName))
            yield return new ValidationResult("Firstname required", new[] {"FirstName"})
    }
}