2011-01-28 4 views
61

を生成し得るために、私は私のフィールドをレンダリングするためのHTMLヘルパーを使用します。どのようにHTMLのID asp.net MVC EditorForで

<%=Html.EditorFor(m => m.User.Surname)%> 

、出力はこのようなものになるだろう:

<input class="text-box single-line" id="User_Surname" 
      name="User.Surname" type="text" value="" /> 

ヘルパーはclassName + 'を使用します。 idを構築するfieldName
私はidをjQuery関数に渡す必要があります。それをハードコーディングせずに持っていく方法はありますか? ASP.NET MVC2の規約を使用できるヘルパーですか?

答えて

7

私は自分のアプリケーションの名前空間

<%@ Import Namespace="MvcApplication2" %> 

を輸入してきたし、最終的に私はこのように私のコードを使用することができます

public static class HtmlHelperExtensions 
{ 
    public static string HtmlIdNameFor<TModel, TValue>(
     this HtmlHelper<TModel> htmlHelper, 
     System.Linq.Expressions.Expression<Func<TModel, TValue>> expression) 
    { 
     return (GetHtmlIdNameFor(expression)); 
    } 

    private static string GetHtmlIdNameFor<TModel, TValue>(Expression<Func<TModel, TValue>> expression) 
    { 
     if (expression.Body.NodeType == ExpressionType.Call) 
     { 
      var methodCallExpression = (MethodCallExpression)expression.Body; 
      string name = GetHtmlIdNameFor(methodCallExpression); 
      return name.Substring(expression.Parameters[0].Name.Length + 1).Replace('.', '_'); 

     } 
     return expression.Body.ToString().Substring(expression.Parameters[0].Name.Length + 1).Replace('.', '_'); 
    } 

    private static string GetHtmlIdNameFor(MethodCallExpression expression) 
    { 
     var methodCallExpression = expression.Object as MethodCallExpression; 
     if (methodCallExpression != null) 
     { 
      return GetHtmlIdNameFor(methodCallExpression); 
     } 
     return expression.Object.ToString(); 
    } 
} 

:Macの答えhereと私の命令は私自身のカスタム拡張を構築しました

<%=Html.HtmlIdNameFor(m=>m.Customer.Name)%> 
+0

「System.Linq.Expressionsを使用する」必要があることは注目に値するこれが機能するにはとにかくスウィートコード:) –

+0

あなたはまた、 '['& ']'(配列要素を参照している場合)を置き換える必要があると思う – Nadav

7

あなたは、いくつかのHTMLは、あなたがTextBoxForを使用するとid

<%= Html.TextBoxFor(m => m.User.Surname, new { id = "myNewId" })%> 
を設定することができますしかし、あなたは EditorFor

でこれを行うことはできません属性に渡し、独自のUser.Surname EditorTemplateを作成しない限り、


この要素をjQueryセレクタで取得するトピックでは、ends-with selectorの一部を使用してハードコードすることなくこれを実現できます。これを使用すれば、EditorForをそのまま使用し、$("[id^='Surname] ")`で選択することができます。この特定の要素を選択しようとすると、実際にjQueryコードで何かをハードコードすることはできません。

+0

HTML属性を追加するのが最も簡単です。独自の拡張メソッドを書くよりもずっと簡単です –

44

この質問を参照してください:get the generated clientid for a form fieldを、これが私の答えです:

私はこのヘルパーを使用します。

public static partial class HtmlExtensions 
{ 
    public static MvcHtmlString ClientIdFor<TModel, TProperty>(
     this HtmlHelper<TModel> htmlHelper, 
     Expression<Func<TModel, TProperty>> expression) 
    { 
     return MvcHtmlString.Create(
       htmlHelper.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldId(
        ExpressionHelper.GetExpressionText(expression))); 
    } 
} 

ちょうどあなたが他のヘルパーと同じように、それを使用してください:@Html.ClientIdFor(model=>model.client.email)

+12

私の答えは、これは今、Html.IdFor()とASP.NET 4に組み込まれています – bkaid

+0

ありがとうそんなに私はそれが必要でした。 html.IdFor()は、私がカスタムヘルパーを作ったので私を助けなかった、 – CMS

133

ASPを.NET MVC 4には、Html.IdFor()が組み込まれています。

@Html.IdFor(m => m.User.Surname) 
関連する問題