0


1

DataAnnotationsとFluentValidationがMVC 2プロジェクトで機能しない

元の質問を編集しましたが、これは実装の違いと同じエラーが発生しているため、Ninjectをミックスに追加しました。

検証ルールのクラスを作成しました

public class AlbumValidator : AbstractValidator {
    public AlbumValidator() {
        RuleFor(a => a.Title).NotEmpty();
    }
}

NinjectのValidatorModuleを作成しました

internal class FluentValidatorModule : NinjectModule {
    public override void Load() {
        AssemblyScanner.FindValidatorsInAssemblyContaining()
            .ForEach(result => Bind(result.InterfaceType).To(result.ValidatorType).InSingletonScope());
    }
}

これが私のValidatorFactoryです

public class NinjectValidatorFactory : ValidatorFactoryBase {
    public override IValidator CreateInstance(Type validatorType) {
        if (validatorType.GetGenericArguments()[0].Namespace.Contains("DynamicProxies")) {
            validatorType = Type.GetType(string.Format("{0}.{1}[[{2}]], {3}",
                validatorType.Namespace,
                validatorType.Name,
                validatorType.GetGenericArguments()[0].BaseType.AssemblyQualifiedName,
                validatorType.Assembly.FullName));
        }

        return Container.Get(validatorType) as IValidator;
    }

    IKernel Container { get; set; }
    public NinjectValidatorFactory(IKernel container) {
        Container = container;
    }
}

そして私のグローバルからの関連部分

protected override void OnApplicationStarted() {
        AreaRegistration.RegisterAllAreas();
        RegisterRoutes(RouteTable.Routes);

        var factory = new NinjectValidatorFactory(Container);

        ModelValidatorProviders.Providers.Add(
            new FluentValidationModelValidatorProvider(factory));

        DataAnnotationsModelValidatorProvider
            .AddImplicitRequiredAttributeForValueTypes = false;
    }

    protected override IKernel CreateKernel() {
        return Container;
    }

    IKernel Container {
        get { return new StandardKernel(new FluentValidatorModule()); }
    }

サンプルサイトをロードし、[新しいアルバムの作成]リンクをクリックしてから、[作成]ボタンをクリックしてタイトルを空のままにします。エラー保護オーバーライドが表示されます。 RegisterRoutes(RouteTable.Routes);

        var factory = new NinjectValidatorFactory(Container);

        ModelValidatorProviders.Providers.Add(
            new FluentValidationModelValidatorProvider(factory));

        DataAnnotationsModelValidatorProvider
            .AddImplicitRequiredAttributeForValueTypes = false;
    }

    protected override IKernel CreateKernel() {
        return Container;
    }

    IKernel Container {
        get { return new StandardKernel(
            new Bootstrapper(),
            new FluentValidatorModule()); }
    }

createフォームをロードし、createをクリックしてタイトルを空のままにし、エラーを見ます

This property cannot be set to a null value.

参照する行は、Entity Frameworkの自動生成クラス内にあり、

Namespace.Contains("DynamicProxies")

それはfalseを返していましたが、これはEFにカスタム名前空間SampleMusicStore.Webを使用するように指示したためですか?

それとも私は他に何かが足りない?

乾杯。

1 Answer


1


問題は、Entity Frameworkがクラスで動的プロキシを生成し、システムが定義したクラスではなくプロキシクラスに対して検証を試みていることです。

これを解決する方法は、これと同じですhttps://stackoverflow.com/questions/2878117/using-fluentvalidation-with-castle-windsor-and-entity-framework-4-0-poco-in-mvc/2885854# 2885854 [answer]。