2

質問の要約: 特定のモデルに対して流暢なバリデーターが解決されたときに、モデルの状態からエラーのリストをクリアすることは可能ですか? このように流暢な検証は、データ注釈モデル プロバイダーのデフォルトの動作を補完するのではなく、上書きしますか?

私はこのような流暢な検証を使用しています:

FluentValidationModelValidatorProvider.Configure(
    _ =>
        {
            // This does not seem to work, or i am misunderstanding it?
            _.AddImplicitRequiredValidator = false;
        });

コンテナーに autofac を使用していますが、流暢な検証は実際にはまだコンテナーを使用していません。上記のように設定しています。

私はこのようなモデルを持っています:

[Validator(typeof(PartyModelValidator))]
public class PartyModel
{

バリデーターはこのように検証します...

public class PartyModelValidator : AbstractValidator<PartyModel>
{
    /// <summary>
    /// Initialises a new instance of the <see cref="PartyModelValidator"/> class.
    /// </summary>
    public PartyModelValidator()
    {
        this.RuleFor(_ => _.Client)
            .SetValidator(new ClientValidator())
            .When(_ => _.SelectedPartyTab == PartyType.Person);
        this.RuleFor(_ => _.Organisation)
            .SetValidator(new OrganisationValidator())
            .When(_ => _.SelectedPartyTab == PartyType.Organisation);

[Required]一部の個人オブジェクトと組織オブジェクトに属性があることを除いて、検証は正常に機能しています。

これらの[Required]属性は検証エラーとして表示されます。オブジェクト全体が実際には null の場合でも、これらのエラーが発生します。

特定の流暢なバリデーターが上記のように構成されている場合、流暢な検証でデータ注釈プロパティを無視するにはどうすればよいですか? ビューの検証以外の目的で使用されるため、オブジェクトに注釈を付けたままにしますか?

4

1 に答える 1

1

他の誰かがコードを必要とする場合に備えて、これでうまくいきます。

/// <summary>
/// The fluent validation model validator provider ex.
/// </summary>
internal class FluentValidationModelValidatorProviderEx : FluentValidationModelValidatorProvider
{
    /// <summary>
    /// Initialises a new instance of the <see cref="FluentValidationModelValidatorProviderEx"/> class.
    /// </summary>
    /// <param name="validatorFactory">
    /// The validator factory.
    /// </param>
    public FluentValidationModelValidatorProviderEx(IValidatorFactory validatorFactory) : base(validatorFactory)
    {
    }

    /// <summary>
    /// get the fluent validators.
    /// </summary>
    /// <param name="metadata">The metadata.</param>
    /// <param name="context">The context.</param>
    /// <returns>the set of validators, if any validators are resolved.</returns>
    /// <remarks>If the fluent validator(s) are supplied, then clear the current set of model errors.</remarks>
    public override IEnumerable<ModelValidator> GetValidators(ModelMetadata metadata, ControllerContext context)
    {
        var validators = base.GetValidators(metadata, context);
        var modelValidators = validators as ModelValidator[] ?? validators.ToArray();
        if (modelValidators.Any())
            context.Controller.ViewData.ModelState.Clear();
        return modelValidators;
    }

    /// <summary>
    /// configure fluent validation.
    /// </summary>
    /// <param name="configurationExpression">The configuration expression.</param>
    internal static void ConfigureFluentValidation(Action<FluentValidationModelValidatorProvider> configurationExpression = null)
    {
        configurationExpression = configurationExpression ?? (Action<FluentValidationModelValidatorProvider>)(param0 => { });
        FluentValidationModelValidatorProvider validatorProvider = new FluentValidationModelValidatorProviderEx((IValidatorFactory)null);
        configurationExpression(validatorProvider);
        DataAnnotationsModelValidatorProvider.AddImplicitRequiredAttributeForValueTypes = false;
        ModelValidatorProviders.Providers.Add((ModelValidatorProvider)validatorProvider);
    }
}
于 2013-09-29T06:30:26.823 に答える