c# - MVC3-html.helperでデータ属性を取得する

原文 c# asp.net-mvc-3 data-annotations

カスタムHTMLヘルパーオブジェクトのフォーマットを制御するカスタム属性を作成しようとしています。私のカスタムセレクタークラスのソースコードは(コードはhttp://forums.asp.net/t/1649193.aspx/1/10から)です。

        public static MvcHtmlString DdUovFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, IEnumerable<SelectListItem> selectList, string optionLabel, IDictionary<string, object> htmlAttributes)
    {
        ModelMetadata metadata = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData);
        var m = expression.Body.GetType();

        IDictionary<string, object> validationAttributes = htmlHelper
            .GetUnobtrusiveValidationAttributes(ExpressionHelper.GetExpressionText(expression), metadata);

        if (htmlAttributes == null)
            htmlAttributes = validationAttributes;
        else
            htmlAttributes = htmlAttributes.Concat(validationAttributes).ToDictionary(k => k.Key, v => v.Value);

        return SelectExtensions.DropDownListFor(htmlHelper, expression, 
               selectList, optionLabel, htmlAttributes);
    }


私のカスタム属性は

[AttributeUsage(AttributeTargets.Method | AttributeTargets.Property | 
      AttributeTargets.Field | AttributeTargets.Parameter, AllowMultiple = false)]
public class LookUpAttribute : Attribute
{
    public LookUpAttribute(Type providerName)
    {
        this.providerName = providerName;
    }
    protected ILookup providerName;
}


私の問題は、HTMLヘルパーメソッドでカスタム属性を取得する方法を理解できないことです。
答え
これを実現する最良の方法は、属性にIMetadataAwareを実装することです。 OnMetadataCreatedメソッドの実装では、metadata.AdditionalValues辞書に値を追加する必要があります。その後、ヘルパーなどでModelMetadataにアクセスできる場所であればどこでも値を取得できます。

このソリューションは、メタデータが属性によって駆動されるという事実に関する情報を実際にはエンコードしないため、推奨される方法です。
関連記事

c# - 多くのアプリケーションにわたるプロジェクト参照の整合性

c# - LINQクエリ変数をDataTableに変換できません

c# - TraceOptions.Timestampを使用するときにTimestampデータをフォーマットする方法

c# - Mysqlデータソースをasp.netのデータグリッドビュー列にバインドする

c# - Excel VBAコード変換

c# - 最初にOracle用のdotconnectを使用して、EF 4.1コードで「schema.tablename」形式でPOCOをマッピングする

c# - このコードのP / invokeインターフェースを指定するにはどうすればよいですか?

c# - HttpWebRequestのGetResponse()を取得するとProtocolViolationExceptionが発生する

c# - Excel日付値

c# - LINQ to SQLでXMLデータ型を使用する