2011-03-24 13 views
15

¿Hay alguna manera de obtener el ID del cliente generado para un campo generado con un helper html?obtener el clientid generado para un campo de formulario

tengo varios componentes que a veces están dentro de otras formas, y quiero adjuntar eventos de JavaScript a ellos.

así, por ejemplo, me gustaría tener:

@Html.TextBoxFor(model => model.client.email) 

<script> 
$('#@getmyusercontrolid(model=>model.client.email)').val("put your mail here"); 
</script> 
+1

La respuesta aceptada no está actualizado, véase mi respuesta para una mejor solución. –

Respuesta

31

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)

+0

Lamento mezclar mis metáforas, pero esto funciona como un amuleto bien engrasado – coalvilledave

+0

¿De dónde sacas 'ExpressionHelper.GetExpressionText'? – mxmissile

+0

Está en System.Web.Mvc –

5

usted podría intentar especificando el ID del argumento htmlAttributes cuando se genera el campo de entrada, por ejemplo,

@Html.TextBoxFor(model => model.client.email, new { id = "emailTextBox" }) 

continuación, puede utilizar esto en su código JavaScript

var email = $('#emailTextBox').val(); 
+0

que no funcionará si tiene más de una instancia del componente en la misma página, y tampoco es útil si desea enlazar datos en la acción de destino. – Jokin

+0

Sé que esta es una respuesta antigua, pero ... al usar MVC y Razor view engine necesitas escapar de la identificación con el símbolo '@' ejemplo: '@ id =" emailTextBox "' –

9

MVC 5 tiene NameFor, por lo que su ejemplo de uso es:

@Html.TextBoxFor(model => model.client.email) 

<script> 
$('#@Html.NameFor(model => model.client.email)').val("put your mail here"); 
</script> 

EDITAR

IdFor también está disponible, que puede ser más apropiado en esta situación que NameFor.

4

Uso @Html.IdFor(model => model.client.email) ya que esta funcionalidad ya existe como tal:

@Html.TextBoxFor(model => model.client.email) 

<script> 
$('#@Html.IdFor(model => model.client.email)').val("put your mail here"); 
</script> 

Usted puede leer más sobre él en la siguiente página: https://msdn.microsoft.com/en-us/library/hh833709%28v=vs.118%29.aspx

Cuestiones relacionadas