2011-01-28 21 views
61

utilizo los ayudantes HTML para hacer mis campos:Cómo obtener el ID de HTML generado por asp.net MVC EditorFor

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

y la salida sería algo como esto:

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

El helper usa className + '.' è fieldName para construir la identificación.
Necesito pasar el id a una función jQuery. ¿Hay alguna forma de tenerlo sin codificarlo? ¿Quizás un ayudante que puede usar las convenciones de ASP.NET MVC2?

Respuesta

7

He seguido las instrucciones de respuesta de Mac here y he construido mi propia extensión personalizada:

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

he importado espacio de nombres

<%@ Import Namespace="MvcApplication2" %> 

de mi solicitud y finalmente puedo usar mi código como este:

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

Vale la pena señalar que necesita un 'using System.Linq.Expressions;' para que esto funcione Código dulce de todos modos :) –

+0

Creo que también necesita reemplazar '[' & ']' (si hace referencia a elementos de la matriz) – Nadav

7

a menos que cree su propio User.Surname EditorTemplate el que se pasa en algunos atributos HTML que no será capaz de hacer esto con EditorFor

Sin embargo puede utilizar TextBoxFor y establecer el ID

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

Sobre el tema de recuperar este elemento con un selector jQuery puede lograrlo sin tener que forzar el código usando alguno de los ends-with selector. El uso que usted podría utilizar probablemente todavía EditorFor y sólo tendrá que seleccionar con $("[id^='Surname] ")`. Si usted está tratando de seleccionar este elemento específico en realidad no hay manera de no codificar algo en el código de jQuery.

+0

Agregar los atributos HTML es la manera MÁS FÁCIL. Mucho más fácil que escribir sus propios métodos de extensión –

44

Ver esta pregunta: get the generated clientid for a form field, esta es mi respuesta:

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

lo usa tal como lo haría con cualquier otro ayudante: @Html.ClientIdFor(model=>model.client.email)

+12

Por mi respuesta, esto ahora está integrado en ASP.NET 4 con Html.IdFor() – bkaid

+0

gracias tanto lo necesitaba. html.IdFor() no me ayudó porque estoy haciendo un asistente personalizado, – CMS

133

ASP .NET MVC 4 tiene Html.IdFor() incorporado que puede devolver esto:

@Html.IdFor(m => m.User.Surname) 
Cuestiones relacionadas