2011-01-28 16 views
61

Io uso le Helpers HTML per rendere i miei campi:Come ottenere l'ID HTML generato da asp.net MVC EditorFor

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

e l'uscita sarebbe qualcosa di simile:

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

Il helper usa className + '.' è fieldName per costruire l'id.
Ho bisogno di passare l'id a una funzione jQuery. C'è un modo per averlo senza hardcoding? Forse un helper che può utilizzare le convenzioni MVC2 di ASP.NET?

risposta

7

Ho seguito le istruzioni di risposta di Mac here e ho costruito la mia estensione personalizzata:

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(); 
    } 
} 

ho importato dello spazio dei nomi di mia applicazione

<%@ Import Namespace="MvcApplication2" %> 

e, infine, posso utilizzare il mio codice come questo:

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

Vale la pena notare che è necessario un 'uso di System.Linq.Expressions;' per questo funziona. Dolce codice comunque :) –

+0

Penso che devi anche sostituire '[' & ']' (se fai riferimento agli elementi dell'array) – Nadav

7

a meno che non si crea il proprio User.Surname EditorTemplate che si passa in alcuni attributi HTML non sarà in grado di fare questo con EditorFor

Tuttavia è possibile utilizzare TextBoxFor e impostare l'id

<%= Html.TextBoxFor(m => m.User.Surname, new { id = "myNewId" })%> 

Sull'argomento del recupero di questo elemento con un selettore jQuery è possibile ottenere questo risultato senza dover utilizzare hardcode utilizzando alcuni degli ends-with selector. Utilizzando che probabilmente si può ancora usare EditorFor e basta selezionarlo con $("[id^='Surname] ")`. Se stai cercando per selezionare questo elemento specifico non c'è davvero nessun modo per non hardcode qualcosa nel vostro codice jQuery.

+0

Aggiungere gli attributi HTML è il modo più semplice. Molto più semplice della scrittura dei propri metodi di estensione –

44

Vedere questa domanda: get the generated clientid for a form field, questa è la mia risposta:

io uso questo helper:

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))); 
    } 
} 

utilizzarlo proprio come si farebbe con qualsiasi altro aiutante: @Html.ClientIdFor(model=>model.client.email)

+12

Per mia risposta, questo è ora integrato in ASP.NET 4 con Html.IdFor() – bkaid

+0

grazie tanto ne avevo bisogno. html.IdFor() non mi ha aiutato perchè sto facendo un aiuto personalizzato, – CMS

133

ASP .NET MVC 4 ha Html.IdFor() integrato che può restituire questo:

@Html.IdFor(m => m.User.Surname) 
Problemi correlati