gpt4 book ai didi

asp.net-mvc-3 - ASP.NET MVC 3 : Validating model when information external to the model is required

转载 作者:行者123 更新时间:2023-12-04 01:43:06 26 4
gpt4 key购买 nike

当需要模型外部的信息才能进行验证时,验证模型的好方法是什么?例如,考虑以下模型:

public class Rating {
public string Comment { get; set; }
public int RatingLevel { get; set; }
}

然后系统管理员可以设置 RatingLevels需要评论。这些设置可通过设置服务获得。

因此,为了完全验证模型,我需要它外部的信息,在本例中是设置服务。

到目前为止,我已经考虑了以下内容:
  • 将服务注入(inject)模型。 DefaultModelBinder使用 System.Activator创建对象,因此它不会通过正常的依赖解析器,并且我无法在不创建新模型绑定(bind)器的情况下将服务注入(inject)模型(除此之外,这感觉不是正确的方法) .
  • 将服务注入(inject)注解。 我还不确定这是否可行,但很快会进一步调查。感觉还是很笨拙。
  • 使用自定义模型绑定(bind)器 .显然我可以实现 OnPropertyValidating进行自定义属性验证。到目前为止,这似乎是最可取的,尽管我还不知道该怎么做。

  • 上面哪种方法最适合这种类型的验证问题?

    最佳答案

    选项 1 不适合。 唯一可行的方法是通过服务定位器反模式引入依赖项。

    选项 2 不起作用。 尽管由于 C# 属性要求,我看不出这是怎么可能的,但这是可能的。请参阅以下内容以获取引用:

  • Resolving IoC Container Services for Validation Attributes in ASP.NET MVC
  • NInjectDataAnnotationsModelValidatorProvider

  • 选项 3:我之前不知道这个,但是编写验证器的一种非常强大的方法似乎是使用 ModelValidator类和相应的 ModelValidatorProvider .

    首先,您创建自定义 ModelValidatorProvider:
    public class CustomModelValidatorProvider : ModelValidatorProvider
    {
    public CustomModelValidatorProvider(/* Your dependencies */) {}

    public override IEnumerable<ModelValidator> GetValidators(ModelMetadata metadata, ControllerContext context)
    {
    if (metadata.ModelType == typeof(YourModel))
    {
    yield return new YourModelValidator(...);
    }
    }
    }

    ASP.NET MVC 的 IDependencyResolver将尝试解析上述提供程序,因此只要它已在您的 IoC 容器中注册,您就无需执行任何其他操作。然后是 ModelValidator:
    public class EntryRatingViewModelValidatorMvcAdapter : ModelValidator
    {
    public EntryRatingViewModelValidatorMvcAdapter(
    ModelMetadata argMetadata,
    ControllerContext argContext)
    : base(argMetadata, argContext)
    {
    _validator = validator;
    }


    public override IEnumerable<ModelValidationResult> Validate(object container)
    {
    if (/* error condition */)
    {
    yield return new ModelValidationResult
    {
    MemberName = "Model.Member",
    Message = "Rating is required."
    };
    }
    }
    }

    由于提供者是通过 IDependencyResolver 检索的并且提供者可以完全控制返回的 ModelValidator s 我可以轻松地注入(inject)依赖项并执行必要的验证。

    关于asp.net-mvc-3 - ASP.NET MVC 3 : Validating model when information external to the model is required,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7743854/

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