Nuevo MVC y han estado corriendo a través de los tutoriales en el asp.net sitio web.

Se incluye un ejemplo de un código html personalizado ayudante para truncar largo texto que se muestra en una tabla.

Sólo me preguntaba ¿qué otras soluciones de la gente ha llegado con el uso de HTML ayudantes y si hay alguna de las mejores prácticas o de las cosas a evitar a la hora de crear/uso de ellos.

Como un ejemplo, yo estaba considerando la posibilidad de escribir un auxiliar personalizada para dar formato a fechas en las que tengo que mostrar en varios lugares, pero ahora estoy preocupado de que puede haber una solución más elegante(I. E. DataAnnotations en mis modelos)

Los pensamientos?

EDICIÓN:

Otro uso potencial se me acaba de ocurrir…concatenación de cadenas.
Un auxiliar personalizada que se podría tomar en un identificador de usuario como de entrada y de retorno de los Usuarios nombre completo…
El resultado podría ser alguna forma de (Cargo) (nombre) (segundo nombre) (Apellido) dependiendo de los campos disponibles. Sólo un pensamiento, no he probado nada de esto todavía.

  • Todavía estoy interesado en ver alguna cosas interesantes de otras personas que han hecho con HTML Personalizado Ayudantes. Siéntete libre de ellos!
InformationsquelleAutor stephen776 | 2011-01-26

3 Comentarios

  1. 16

    Bien en el caso de que el formato de la DisplayFormat atributo podría ser una buena solución:

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

    y, a continuación, simplemente:

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

    Tan lejos como el truncamiento de la cadena es que se trate de un código HTML personalizado helper es una buena solución.


    ACTUALIZACIÓN:

    Respecto a su EDICIÓN, personalizados en la ayuda HTML podría funcionar en esta situación, pero también hay un enfoque alternativo que me gusta mucho: modelos de vista. Así que si en este particular punto de vista que siempre se va a mostrar la concatenación de los nombres, a continuación, puede definir un modelo de vista:

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

    Ahora el controlador va a la consulta del repositorio para ir a buscar el modelo y, a continuación, el mapa de este modelo a un modelo de vista que se pasa a la vista para que la vista podía simplemente @Html.DisplayFor(x => x.FullName). El mapeo entre los modelos y los modelos de vista podría ser simplificado con marcos como AutoMapper.

    • muy interesante. Parece casi una custom html helper es un último recurso.
  2. 100

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

    • Html.BodyId(): genera una convencional cuerpo de la etiqueta de identificación para hacer referencia al añadir css personalizado para una vista.
    • Html.SubmitButton(string): genera un input[type=submit] o el botón[type=submit] elemento, en función de cómo desea que el estilo de los botones.
    • Html.Buscapersonas(IPagedList): Para la generación de los controles de paginación de un bloque paginado de la lista modelo.
    • etc….

    Uno de mis favoritos de los usos para HtmlHelpers es SECAR de la forma común de marcado. Normalmente, yo tengo un div contenedor para un formulario en línea, un div de la etiqueta, y una etiqueta para la entrada, validación de mensajes de texto de la sugerencia, etc. En última instancia, esto podría terminar siendo mucho repetitivo etiquetas html. Un ejemplo de cómo he manejado esta de la siguiente manera:

    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...
    }    

    Una vez que hayas hecho esto, usted puede dar salida a las líneas de formulario como este:

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

    … y BAM, todas sus etiquetas, entradas, sugerencias, y la validación de los mensajes en su página. De nuevo, puede utilizar los atributos de los modelos y reflexionar sobre ellos para obtener realmente inteligente y SECO. Y, por supuesto, esto sería una pérdida de tiempo si no se puede estandarizar el diseño del formulario. Sin embargo, para los casos simples, en donde css puede suministrar toda la personalización que usted necesita, funciona grrrrrrrrreat!

    Moral de la historia — HtmlHelpers puede aislar desde el diseño global de los cambios de demolición mano de marcado en la vista, después de la vista. A mi me gustan. Pero se puede ir por la borda, y, a veces, vistas parciales son mejores que los codificados ayudantes. Una regla general yo uso para decidir entre helper vs vista parcial: Si el fragmento de HTML requiere una gran cantidad de lógica condicional de codificación o el engaño, puedo usar un helper (poner el código en el que el código debe ser); si no, si se me acaba la salida común de marcado sin mucha lógica, yo uso una vista parcial (poner el marcado donde el etiquetado debe ser).

    Espero que esto te da algunas ideas!

    • muy bonito! un montón de cosas buenas aquí.
    • Gran post!!! Definitivamente estoy de copiar/pegar algunas de aquí si no te importa 😉
    • Gran respuesta. Me tomó un poco de tiempo para averiguar que necesitaba el uso de System.Web.Mvc.Html; para conseguir la .EditorFor extensiones para mostrar bien
  3. 0
    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);
    }
    • No sólo el código postal sólo respuestas. Puede ser útil para el op, pero no para los lectores futuros. Sugiero que usted debe añadir un poco de explicación de la forma en que la solución es ir a trabajar.

Dejar respuesta

Please enter your comment!
Please enter your name here