Observad el siguiente código de vista, bastante trivial:
@Html.EditorFor(model=>model.Nombre)
<input type="text" name="Nombre" id="Nombre" />
<script type="text/javascript">
$("#Nombre").blur(function () {
var mays = $(this).val().toUpperCase();
$(this).val(mays);
});
</script>
Hay muchos escenarios en los que no está tan claro el identificador que será asignado, sobre todo si estamos generando controles de edición para propiedades de tipos complejos, en vistas parciales, o cuando estamos creando editores personalizados para utilizar con Html.EditorFor()
. Este último caso además es especialmente complicado, puesto que desconocemos por completo el nombre de la propiedad para la cual será utilizado.
Lo que suelo hacer en estos casos es utilizar estos dos pequeños helpers, Html.IdFor()
y Html.NameFor()
, que permiten obtener el nombre e identificador asignado a una propiedad del Modelo accediendo a sus metadatos:
public static class HtmlHelpers
{
public static string IdFor<TModel, TProperty>(this HtmlHelper<TModel> html,
Expression<Func<TModel, TProperty>> expression)
{
string propiedad = ExpressionHelper.GetExpressionText(expression);
return html.ViewData.TemplateInfo.GetFullHtmlFieldId(propiedad);
}
public static string NameFor<TModel, TProperty>(this HtmlHelper<TModel> html,
Expression<Func<TModel, TProperty>> expression)
{
string propiedad = ExpressionHelper.GetExpressionText(expression);
return html.ViewData.TemplateInfo.GetFullHtmlFieldName(propiedad);
}
}
<script type="text/javascript">
$("#@Html.IdFor(model=>model.Nombre)").blur(function () {
var mays = $(this).val().toUpperCase();
$(this).val(mays);
});
</script>
Html.NameFor()
:<input type="text"
id="@Html.IdFor(model=>model.Nombre)"
name="@Html.NameFor(model=>model.Nombre)" />
Muy buen post (como siempre) 😉
Curioso como al principio de MVC decíamos lo de «HTML predecible» y todo eso cuando lo comparábamos con Webforms. Y ahora aquí nos tienes con un Helper para saber que han generado los Helpers de MVC. 😛
Cosas de la evolución supongo… 😉
Un abrazo!
Hola, Eduard! Gracias por comentar 🙂
La verdad es que es bastante predecible, salvo en los casos en que no puede predecirse ;-), como en los casos que comento en el post, los editores personalizados, tipos complejos, etc.
Eso sí, eliminamos las ‘magic strings’ de la vista, y la hacemos medio sensible a los
cambios de nombre de las propiedades
Pero vaya, es cierto lo que dices: al final tenemos que tirar de lo mismo que hacíamos en Webforms. Qué cosas.