2016-11-16 19 views
0

EditorForのカスタムヘルパーを作成しようとしています。私は、モデルから文字列の長さを取り、これをhtml属性に追加したいと思います。MVC Editor Forカスタムヘルパー

私はこれまでのところ次のようなことがありますが、これは追加される新しい属性には当てはまりません。

public static IHtmlString MyEditorFor<TModel, TValue>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TValue>> expression, object ViewData, bool disabled = false, bool visible = true) 
    { 
     var member = expression.Body as MemberExpression; 
     var stringLength = member.Member.GetCustomAttributes(typeof(StringLengthAttribute), false).FirstOrDefault() as StringLengthAttribute; 

     RouteValueDictionary viewData = HtmlHelper.AnonymousObjectToHtmlAttributes(ViewData); 
     RouteValueDictionary htmlAttributes = HtmlHelper.AnonymousObjectToHtmlAttributes(viewData["htmlAttributes"]); 

     if (stringLength != null) 
     { 
      htmlAttributes.Add("maxlength", stringLength.MaximumLength); 
     } 

     return htmlHelper.EditorFor(expression, ViewData); 
    } 
+0

'htmlHelper.EditorForを返す

以前のMVCのバージョンの

HtmlHelper.TextBoxForの利用がより確実maxlength属性を持っている、好ましいです(式、ViewData) 'は属性を追加していません。メソッドに渡した元の 'ViewData'属性をそのまま使用します –

+0

それを編集して属性を返すにはどうしたらいいですか?新しいviewDataオブジェクトを別の型として返すことができません – user3208483

答えて

0

カスタムHTMLがreturn htmlHelper.EditorFor(expression, ViewData)にコレクション属性の代わりにメソッドのパラメータには、元のViewData属性を返します。 this answerから基づいて、あなたの復帰方法は、これに変更する必要があります

public static IHtmlString MyEditorFor<TModel, TValue>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TValue>> expression, object ViewData, bool disabled = false, bool visible = true) 
{ 
    var member = expression.Body as MemberExpression; 
    var stringLength = member.Member.GetCustomAttributes(typeof(StringLengthAttribute), false).FirstOrDefault() as StringLengthAttribute; 

    RouteValueDictionary viewData = HtmlHelper.AnonymousObjectToHtmlAttributes(ViewData); 
    RouteValueDictionary htmlAttributes = HtmlHelper.AnonymousObjectToHtmlAttributes(viewData["htmlAttributes"]); 

    if (stringLength != null) 
    { 
     htmlAttributes.Add("maxlength", stringLength.MaximumLength); 
    } 

    return htmlHelper.EditorFor(expression, htmlAttributes); // use custom HTML attributes here 
} 

を次に、このようにビュー側のカスタムHTMLヘルパーを適用します。

@Html.MyEditorFor(model => model.Property, new { htmlAttributes = new { @maxlength = "10" }}) 

編集

この方法は、上の作品MVC 5(5.1)以上では、以前のバージョンで動作するかどうかはわかりません(この質問を参照してください:Html attributes for EditorFor() in ASP.NET MVC)。

return htmlHelper.TextBoxFor(expression, htmlAttributes); 

その他の参照:

Set the class attribute to Html.EditorFor in ASP.NET MVC Razor View

HTML.EditorFor adding class not working

+0

'EditorFor()'メソッドは2番目のパラメータのhtml属性を受け入れません –

関連する問題