2

データベースに保存されたメタデータに基づいてモデルを検証する必要があるアプリケーションに取り組んでいます。これの目的は、クライアントの好みに応じて、管理者がコードを変更することなく、一部のモデルの検証方法を変更できるようにすることです。変更は、アプリケーションにアクセスする特定のユーザーではなく、アプリケーション全体に適用されます。どのように変更されるかは、現時点では問題ではありません。これらは、データベース上で直接変更することも、アプリケーションを使用して変更することもできます。アイデアは、それらがカスタマイズ可能であるべきだということです。

タイプ「文字列」のプロパティ「名前」を持つモデル「人」があるとしましょう。

public class Person
{
    public string Name { get; set; }
}

このモデルは、複数のサーバーに分散およびインストールされている私のアプリで使用されています。それらのそれぞれは独立しています。名前を最大 30 文字にして、新しい「人」を作成するときに必須にしたいユーザーもいれば、必須ではなく 25 文字にしたいユーザーもいます。通常、これはデータ注釈を使用して解決されますが、それらはコンパイル時に評価され、何らかの形で「ハードコーディング」されます。

まもなく、アプリケーション コードを変更することなく、モデルの検証方法をカスタマイズしてデータベースに保存する方法を見つけたいと思います。

また、jquery 検証を使用して、データベース (/サービス) への要求をできるだけ少なくするとよいでしょう。それに加えて、EF のような既知の ORM は使用できません。

4

1 に答える 1

1

データベースに保存されているメタデータを調べて検証するカスタム検証属性を作成できます。カスタム検証属性は簡単に作成でき、メソッドを拡張System.ComponentModel.DataAnnotations.ValidationAttributeしてオーバーライドするだけです。IsValid()

jQuery 検証で機能するクライアント側のルールを取得するには、拡張するカスタム検証属性のタイプ用のカスタム アダプターを作成する必要がありますSystem.Web.Mvc.DataAnnotationsModelValidator<YourCustomValidationAttribute>OnApplicationStart()次に、このクラスを のメソッドに登録する必要がありますGlobal.asax

DataAnnotationsModelValidatorProvider.RegisterAdapter(typeof(YourCustomValidationAttribute), typeof(YourCustomAdapter));

アダプターの例を次に示します。

public class FooAdapter : DataAnnotationsModelValidator<FooAttribute>
{
    /// <summary>
    /// This constructor is used by the MVC framework to retrieve the client validation rules for the attribute
    /// type associated with this adapter.
    /// </summary>
    /// <param name="metadata">Information about the type being validated.</param>
    /// <param name="context">The ControllerContext for the controller handling the request.</param>
    /// <param name="attribute">The attribute associated with this adapter.</param>
    public FooAdapter(ModelMetadata metadata, ControllerContext context, FooAttribute attribute)
        : base(metadata, context, attribute)
    {
        _metadata = metadata;
    }

    /// <summary>
    /// Overrides the definition in System.Web.Mvc.ModelValidator to provide the client validation rules specific
    /// to this type.
    /// </summary>
    /// <returns>The set of rules that will be used for client side validation.</returns>
    public override IEnumerable<ModelClientValidationRule> GetClientValidationRules()
    {
        return new[] { new ModelClientValidationRequiredRule(
            String.Format("The {0} field is invalid.", _metadata.DisplayName ?? _metadata.PropertyName)) };
    }

    /// <summary>
    /// The metadata associated with the property tagged by the validation attribute.
    /// </summary>
    private ModelMetadata _metadata;
}

これは、サーバー側の検証http://msdn.microsoft.com/en-us/library/system.web.mvc.remoteattribute(v=vs.108).aspxを非同期的に呼び出したい場合にも役立ちます。

于 2013-08-20T12:57:35.750 に答える