Asp.net mvc 需要接触数据库的模型验证推荐方法
到目前为止,我们的大多数验证都是使用视图模型上的验证属性执行的 我们需要执行的另一个验证检查是验证我们的数据库中不存在字符串 最初,我只是在控制器操作中处理此检查,然后在需要时将错误添加到ModelState中。然而,我宁愿使用内置的验证基础设施 我尝试的一种方法是在我的viewmodel上实现IValidTeableObject。当我调用DependencyResolver时,感觉有点不对劲:Asp.net mvc 需要接触数据库的模型验证推荐方法,asp.net-mvc,validation,asp.net-mvc-3,Asp.net Mvc,Validation,Asp.net Mvc 3,到目前为止,我们的大多数验证都是使用视图模型上的验证属性执行的 我们需要执行的另一个验证检查是验证我们的数据库中不存在字符串 最初,我只是在控制器操作中处理此检查,然后在需要时将错误添加到ModelState中。然而,我宁愿使用内置的验证基础设施 我尝试的一种方法是在我的viewmodel上实现IValidTeableObject。当我调用DependencyResolver时,感觉有点不对劲: public IEnumerable<ValidationResult> Validat
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
var viewModel = validationContext.ObjectInstance as EditPostViewModel;
if (viewModel != null)
{
var slug = (Slug)viewModel.Slug;
var repo = DependencyResolver.Current.GetService<IRepository<Post>>();
var existing = repo.Get(p => p.Slug == slug && p.Id != viewModel.Id);
if (existing != null)
yield return new ValidationResult("Duplicate slug.", new[] { "Slug" });
}
}
其余部分是特定于应用程序的,但本质上我为我想要验证的每种类型的“slagable”实体创建了一个验证器。然后用我的容器注射
public interface ISlugValidator<TEntity> where TEntity : ISlugable {
IValidationDictionary ValidationDictionary { get; set; }
bool ValidateSlug(Guid? entityId, Guid featureId, Slug slug);
}
公共接口ISlugValidator,其中tenty:ISlugable{
IValidationDictionary验证字典{get;set;}
bool ValidateSlug(Guid?entityId、Guid featureId、Slug-Slug);
}
在控制器操作中检查ModelState.IsValid
之前,我调用了ValidateSlug(…)
这是一个很好的解决方案,可以满足我目前需要的验证级别,而且大多数验证都可以使用数据注释来处理。如果我的验证/业务规则变得更复杂,我可能会切换到FluentValidation(这也适用于依赖性注入),因为它更适合外部化验证逻辑。我建议进行这种类型的验证,而不必费心于数据注释。谢谢Darin。我遵循了文章中的方法,用我的最终解决方案和一些想法更新了我的问题。
public interface ISlugValidator<TEntity> where TEntity : ISlugable {
IValidationDictionary ValidationDictionary { get; set; }
bool ValidateSlug(Guid? entityId, Guid featureId, Slug slug);
}