2012-10-06 19 views
13

ブートストラップ互換のフォームフィールドを作成するHtmlHelperを作成しようとしています。私の最初の目標は、周囲のdivを作成するのHtmlHelperを作成することでした。ModelMetadataを使用して完全なプロパティ名を取得する

<div class="control-group"> ... </div> 

ここにも優れた助言に続き、ここで私はそれが比較的早く仕事を得ることができました。しかし、それは常に機能するとは限りません。

私は複雑なプロパティを持つViewModelを持っています。私のフォームでは、m=>m.Complex.Elementというフィールドにアクセスしています。私のヘルパーでは、検証エラーの要素をチェックします。私はModelMetadata.FromLambdaExpression(expression, html.ViewData)を使用します。私が戻ったメタデータはElementであり、Complex.Elementではありません。

このプロパティのModelStateをチェックすると、ModelStateが完全な名前(Complex.Element)を保持しているため、このプロパティを見つけることができません。

他の要素がないことを期待して部分一致を探すことができますが、それは起こるのを待っている厄介なバグのようです。式から完全なプロパティ名を取得するにはどうすればよいですか?

答えて

27

MVCソースが開いているのは良いことです。 ModelStateプロパティ名を取得するための適切な方法は、私は私が必要な属性の両方の回答の組み合わせを使用しました

var propertyName = ExpressionHelper.GetExpressionText(expression); 
+1

+1を得ることができます。私も同じ問題がありました。あなたの答えは私を助けた:) –

6

これまでのモデルでは、次のように使用してプロパティを取得することができます。

ViewContext.ViewData.TemplateInfo.HtmlFieldPrefix; 

それ以外の場合は、反射/ ilspy /何でも、何あなたのEditorFor/TextBoxForまたはあなたのエディタをんレンダリングされているものの方法をご確認引き出します。

+0

私は空の接頭語を得ます。私はMVC 3のソースを調べ、Microsoftがこれを解決する方法を見ていきます。他の誰かがそれを知っていて、私を時間を節約することができたと思った。 – zmbq

+0

私はHtmlHelper-Extensionsとエディタ/ディスプレイテンプレート内でこれを(ViewContextなしで)使用します。これまでのところうまく動作します – Ingo

+1

独自のhtmlヘルパー拡張を記述すると、そこから 'htmlHelper.ViewData.TemplateInfo.HtmlFieldPrefix' – Odys

4

を使用することです。これらの答えはともに、ビューとネストされたエディタテンプレートの両方で使用できる作業属性を提供します。ここに私の例があります:

public static MvcHtmlString HasErrorClassFor<TModel, TProperty>(
    this HtmlHelper<TModel> htmlHelper, 
    Expression<Func<TModel, TProperty>> expression) 
{ 
    string expressionText = ExpressionHelper.GetExpressionText(expression); 

    string htmlFieldPrefix = htmlHelper.ViewData.TemplateInfo.HtmlFieldPrefix; 

    string fullyQualifiedName; 

    if (htmlFieldPrefix.Length > 0) 
    { 
     fullyQualifiedName = string.Join(".", htmlFieldPrefix, expressionText); 
    } 
    else 
    { 
     fullyQualifiedName = expressionText; 
    } 

    bool isValid = htmlHelper.ViewData.ModelState.IsValidField(fullyQualifiedName); 

    if (!isValid) 
    { 
     return MvcHtmlString.Create("has-error"); 
    } 

    return MvcHtmlString.Empty; 
} 
関連する問題