我们有客户要求构建可在多个品牌中重复使用的网络应用。数据结构将保持不变,但某些用例可能需要某些字段,而不是其他字段。
例如,假设我们有一个表单来捕获基本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...
}
}
这种条件验证是否有更简洁的方法?
编辑:我不是在寻找第三方图书馆推荐人员。我正在寻找关于构建验证的建议尽可能灵活。
答案 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"})
}
}