tutorial net mvc español asp asp.net-mvc asp.net-mvc-2 asp.net-mvc-3 html-helper

español - ASP.NET MVC 3 Ayudantes HTML personalizados: mejores prácticas/usos



asp.net mvc versions (3)

Nuevo en MVC y ha estado ejecutando los tutoriales en el sitio web asp.net.

Incluyen un ejemplo de un helper html personalizado para truncar el texto largo que se muestra en una tabla.

Solo me pregunto qué otras soluciones han surgido con los ayudantes de HTML y si hay algunas prácticas recomendadas o cosas que evitar al crearlas / usarlas.

Como ejemplo, estaba considerando escribir un ayudante personalizado para dar formato a las fechas que necesito mostrar en varios lugares, pero ahora me preocupa que pueda haber una solución más elegante (IE DataAnnotations en mis modelos)

¿Alguna idea?

EDITAR:

Otro uso potencial que acabo de pensar ... Concatenación de cadenas. Un asistente personalizado podría tomar un ID de usuario como entrada y devolver un nombre completo de Usuario ... El resultado podría ser alguna forma de (Título) (Primero) (Medio) (Último) dependiendo de cuáles de esos campos están disponibles. Sólo un pensamiento, todavía no he intentado algo como esto.


Bueno, en el caso de formatear el atributo DisplayFormat podría ser una buena solución:

[DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}")] public DateTime Date { get; set; }

y luego simplemente:

@Html.DisplayFor(x => x.Date)

En lo que se refiere a truncar la cadena, una ayuda HTML personalizada es una buena solución.

ACTUALIZAR:

En cuanto a su EDIT, un asistente de HTML personalizado podría funcionar en esta situación, pero también hay un enfoque alternativo que me gusta mucho: ver modelos. Entonces, si en esta vista particular siempre vas a mostrar la concatenación de los nombres, entonces podrías definir un modelo de vista:

public class PersonViewModel { public string FullName { get; set; } }

Ahora el controlador va a consultar el repositorio para obtener el modelo y luego asignar este modelo a un modelo de vista que se pasará a la vista para que la vista simplemente pueda @Html.DisplayFor(x => x.FullName) . El mapeo entre modelos y modelos de vista podría simplificarse con marcos como AutoMapper .


Yo uso HtmlHelpers todo el tiempo, más comúnmente para encapsular la generación de HTML estándar, en caso de que cambie de opinión. He tenido tales ayudantes como:

  • Html.BodyId (): genera una etiqueta de identificación corporal convencional para hacer referencia cuando se agrega CSS personalizado para una vista.
  • Html.SubmitButton (cadena): genera un elemento de entrada [type = submit] o button [type = submit], dependiendo de cómo quiera aplicar estilo a los botones.
  • Html.Pager (IPagedList): para generar controles de paginación desde un modelo de lista paginada.
  • etc ....

Uno de mis usos favoritos para HtmlHelpers es SECAR el marcado de formulario común. Por lo general, tengo un contenedor div para una línea de formulario, un div para la etiqueta y una etiqueta para la entrada, mensajes de validación, texto de sugerencia, etc. En última instancia, esto podría terminar siendo un montón de etiquetas html repetitivas. Un ejemplo de cómo he manejado esto sigue:

public static MvcHtmlString FormLineDropDownListFor<TModel, TProperty>(this HtmlHelper<TModel> helper, Expression<Func<TModel, TProperty>> expression, IEnumerable<SelectListItem> selectList, string labelText = null, string customHelpText = null, object htmlAttributes = null) { return FormLine( helper.LabelFor(expression, labelText).ToString() + helper.HelpTextFor(expression, customHelpText), helper.DropDownListFor(expression, selectList, htmlAttributes).ToString() + helper.ValidationMessageFor(expression)); } public static MvcHtmlString FormLineEditorFor<TModel, TProperty>(this HtmlHelper<TModel> helper, Expression<Func<TModel, TProperty>> expression, string templateName = null, string labelText = null, string customHelpText = null, object htmlAttributes = null) { return FormLine( helper.LabelFor(expression, labelText).ToString() + helper.HelpTextFor(expression, customHelpText), helper.EditorFor(expression, templateName, htmlAttributes).ToString() + helper.ValidationMessageFor(expression)); } private static MvcHtmlString FormLine(string labelContent, string fieldContent, object htmlAttributes = null) { var editorLabel = new TagBuilder("div"); editorLabel.AddCssClass("editor-label"); editorLabel.InnerHtml += labelContent; var editorField = new TagBuilder("div"); editorField.AddCssClass("editor-field"); editorField.InnerHtml += fieldContent; var container = new TagBuilder("div"); if (htmlAttributes != null) container.MergeAttributes(new RouteValueDictionary(htmlAttributes)); container.AddCssClass("form-line"); container.InnerHtml += editorLabel; container.InnerHtml += editorField; return MvcHtmlString.Create(container.ToString()); } public static MvcHtmlString HelpTextFor<TModel, TProperty>(this HtmlHelper<TModel> helper, Expression<Func<TModel, TProperty>> expression, string customText = null) { // Can do all sorts of things here -- eg: reflect over attributes and add hints, etc... }

Sin embargo, una vez que hayas hecho esto, puedes generar líneas de este tipo:

<%: Html.FormLineEditorFor(model => model.Property1) %> <%: Html.FormLineEditorFor(model => model.Property2) %> <%: Html.FormLineEditorFor(model => model.Property3) %>

... y BAM, todas sus etiquetas, entradas, sugerencias y mensajes de validación están en su página. Nuevamente, puede usar atributos en sus modelos y reflexionar sobre ellos para ser realmente inteligente y SECO. Y, por supuesto, esto sería una pérdida de tiempo si no puede estandarizar el diseño de su formulario. Sin embargo, para casos simples, donde css puede proporcionar toda la personalización que necesita, ¡funciona grrrrrrrrrreat!

Moraleja de la historia: HtmlHelpers puede aislarlo de los cambios de diseño globales que arruinan el marcado hecho a mano a la vista después de la vista. Me gustan. Pero puedes ir por la borda, y a veces las vistas parciales son mejores que las de los ayudantes codificados. Una regla general que uso para decidir entre helper vs. partial view: si el fragmento de HTML requiere mucha lógica condicional o trucos de codificación, uso un helper (ponga el código donde debería estar el código); si no, si solo estoy produciendo un marcado común sin mucha lógica, uso una vista parcial (ponga el marcado donde debería estar el marcado).

¡Espero que esto te dé algunas ideas!


public static HtmlString OwnControlName<T, U>(this HtmlHelper<T> helper, Expression<Func<T, U>> expression, string label_Name = "", string label_Title = "", Attr attr = null) { TemplateBuilder tb = null; string template = null; if (expression == null) throw new ArgumentException("expression"); obj = helper.ViewData.Model; tb.Build(obj, expression.Body as MemberExpression, typeof(T), new SimpleTemplate(new TextArea()), label_Name, label_Title, attr); template = tb.Get(); return new MvcHtmlString(template); }