4

これが私の開発要件です。

ラベルの値はデータベースに保存されていますが、データ注釈を宣言的な方法で使用したいと考えています。これは、モデルをより読みやすくするためです。

そして、ここに私のアプローチがあります、

カスタムの DisplayNameAttribute を作成することにしました。ここでは、モデルによって提供される既定値が、データベースから取得された値によって上書きされます。

モデルで定義されたプロパティは次のとおりです。

    [CustomDisplay(Name: "First Name")]
    [CustomRequired(ErrorMessage: "{0} is required")]
    public String FirstName { get; set; }

カスタム表示名属性クラスは次のとおりです。

public class CustomDisplayAttribute : DisplayNameAttribute
{
    private string _defaultName;
    private string _displayName;

    public CustomDisplayAttribute(string Name)
    {
        _defaultName = Name;
    }

    public override string DisplayName
    {
        get
        {
            if (String.IsNullOrEmpty(_displayName))
            {
                _displayName = DAO.RetrieveValue(**ModelName**, _defaultName);
            }
            return _displayName;
        }
    }
}

さて、上記のコードでわかるように、ModelName は必要なものですが、持っていません!!

デバッグ中に ModelMetadataProviders.Current を掘り下げ、現在のモデルが実際に使用可能かどうかを確認します。しかし、それは非公開の静的メンバーの一部であるため、コードからアクセスできません。

ここに画像の説明を入力

リフレクションを通じてモデル名を取得するための以下のメソッドを作成しました。

private static string GetModelName()
{
    var modelName = String.Empty;
    FieldInfo info = typeof(CachedAssociatedMetadataProvider<CachedDataAnnotationsModelMetadata>)
                        .GetField("_typeIds", BindingFlags.NonPublic | BindingFlags.Static);
    var types = (ConcurrentDictionary<Type, string>)info.GetValue(null);
    modelName = types.FirstOrDefault().Key.Name;
    return modelName;
}

しかし、問題は、types コレクションがすべてのモデル (ユーザーが少なくとも 1 回訪れた) のエントリを提供することです。そして、現在活動中の、知る手がかりはありません!!

ここに画像の説明を入力

4

1 に答える 1