1

SQLテーブルへのルックアップを介してページにレンダリングされるコントロールに関連付けられたラベルを変更する方法を提供したいと思います。

理想的には、ヘルパーを使用してページにレンダリングされるメタデータ表示フィールドを挿入したいと思います。

@Html.LabelFor(m => m.city)

これは実行時にSQLルックアップである必要があるため、デザイン時にdisplaynameアノテーションをスタンプするようにクラスscaffoldttテンプレートを変更することはできません。

私は3つの可能な方法を考えました。

  1. 使用したいすべてのhtml.helpersを書き直します。これに関する問題は、変更を加える前に、既存のヘルパーのすべての機能を複製する必要があることです。

  2. カスタムデータ注釈を記述し、クラス内の各プロパティにスタンプします。

    [MyCustomNameAttribute] public string city {get; セットする; }

    次に、MyCustomNameAttributeクラスで、参照しているlinqフィールド、メタデータモデルへの参照、およびこれらを使用するデータベースコンテキストの両方を見つけることができ、ユーザーが構成した潜在的な名前のカスタマイズに基づいてDisplayNameを取得および置換できます。これを実行しようとしましたが、[Display(Name = "city")]アノテーションがバックグラウンドでどのように機能するかを見つけることができませんでした。

  3. エンティティモデルのバッキングコードを変更して、名前をメタデータモデルに挿入します。

上記の経験はありますか?

乾杯ティム

4

1 に答える 1

1

ModelMetaDataProviderを拡張してカスタムを作成する必要がありますDataAnnotationsModelMetadataProvider

public class CustomModelMetadataProvider : DataAnnotationsModelMetadataProvider
{
    protected override ModelMetadata CreateMetadata(
        IEnumerable<Attribute> attributes,
        Type containerType,
        Func<object> modelAccessor,
        Type modelType,
        string propertyName)
    {
        var meta = base.CreateMetadata(attributes, containerType, modelAccessor, modelType, propertyName);

               if(meta.DisplayName == null)
               {
                 // TO DO read the display value from database and assign here
                 meta.DisplayName = .. 
               }

        return meta;
    }
}

次に、Global.asax.csでそれを設定する必要があります

protected void Application_Start()
{
   RegisterRoutes(RouteTable.Routes);
   ModelMetadataProviders.Current = new CustomModelMetadataProvider();
}

dbから表示名のみを設定したいが、dbから完全なmodelmetadataをロードしたい場合はModelMetadataProvider、抽象クラスを実装してカスタムを作成することをお勧めしますModelMetadataProvider

毎回データベースにアクセスするのは良い考えではないので、キャッシュ戦略を練る必要があります。

新しいものごとにデータベースにcontainerTypeアクセスし(おそらく)、コンテナのメタデータ情報とそのすべてのプロパティを読み取り、キーをキーとしてキャッシュに保存するcontainerType必要があります(これは難しい作業になる可能性があります)。

于 2012-10-05T11:13:05.053 に答える