gpt4 book ai didi

asp.net-mvc - 需要接触数据库的模型验证的推荐方法

转载 作者:行者123 更新时间:2023-12-02 00:33:16 24 4
gpt4 key购买 nike

到目前为止,我们的大部分验证都是使用 View 模型上的验证属性来执行的。

我们需要执行的一项附加验证检查是验证数据库中尚不存在字符串。

最初我只是在 Controller 操作中处理此检查,然后根据需要将错误添加到 ModelState 中。但是,我宁愿使用内置的验证基础设施。

我尝试的一种方法是在我的 View 模型上实现 IValidateableObject。当我调用 DependencyResolver 时,感觉有点不对劲:

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" });
}
}

我想到的另一种方法是使用自定义 ValidationAttribute。对我来说,只有当我可以在多个 View 模型上重用它时,这才有意义,并且要重用它,我需要能够构建一个通用存储库接口(interface)(按照上面的代码),因为我可能需要 IRepository<Foo>IRepository<Bar>取决于型号。

远程验证很棒,但我仍然需要验证服务器端。

那么人们会推荐什么或用什么来实现类似的目标。

请注意,我对此列确实有独特的数据库约束,但不想退回到异常处理来执行此验证。

解决方案

我查看了 asp.net articl e @Darin 建议。这种方法肯定有效,但本文有一点缺陷,虽然它设法将验证服务与对 ModelState 的任何直接引用解耦,但最终会出现循环依赖关系,其中 Controller 依赖于验证服务,而验证服务又依赖于在 ModelState 上(通过包装器);在创建 Controller 之前它不存在。好的!

相反,我将 IValidationDictionary 作为验证服务上的公共(public)属性公开,并在我的 Controller 构造函数中设置它:

slugValidator.ValidationDictionary = new ModelStateWrapper(this.ModelState);

其余部分是特定于应用程序的,但本质上我为我想要验证的每种类型的“slugable”实体创建了一个验证器。然后这些被我的容器注入(inject)。

public interface ISlugValidator<TEntity> where TEntity : ISlugable {
IValidationDictionary ValidationDictionary { get; set; }
bool ValidateSlug(Guid? entityId, Guid featureId, Slug slug);
}

我调用ValidateSlug(...)就在我检查ModelState.IsValid之前在我的 Controller 操作中。

对于我当前所需的验证级别来说,这是一个很好的解决方案,而且大多数验证都可以使用数据注释来处理。如果我的验证/业务规则变得更加复杂,我可能会切换到 FluentValidation(这也适用于依赖注入(inject)),因为它更适合外部化验证逻辑。

最佳答案

我建议进行这种类型的验证 at the service layer不用担心数据注释。

关于asp.net-mvc - 需要接触数据库的模型验证的推荐方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6187299/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com