2011-05-07 20 views
13

Espero que alguien tenga algunas ideas. Me gustaría ordenar mi código y por eso ya utilicé Html.LabelFor. Sin embargo, ahora quiero asignar una clase CSS a las etiquetas.¿Puedo agregar una definición de clase CSS a Html.LabelFor en MVC3?

Html.LabelFor(model => model.Customer.Description ????) 

¿Alguien sabe si esto es posible en MVC3? Tenga en cuenta que es MVC3 que estoy usando. Ya vi una publicación que hablaba de MVC2 y no había una solución simple.

Respuesta

9

No hay una forma integrada de hacerlo en MVC 3. Tendrá que escribir su ayudante que hace esto. Eche un vistazo a la clase LabelExtensions para ver cómo se hace.

+1

Gracias. Solo quería confirmar que no había nada nuevo en MVC3. Me pregunto por qué no le dieron a Html.Label un poco más de flexibilidad. Supongo que no soy el único que quiere hacer esto. – JudyJ

+5

@LeeGarner, estoy en el equipo de MVC y no estoy seguro de por qué Label no toma el parámetro 'htmlAttributes'. Tal vez algún descuido. Archivaré un error para asegurarme de que lo agreguemos en la próxima versión. – marcind

+0

@marcind mientras estás en ello, ¿puedes des-internalizar los ayudantes, es decir. en LabelExtensions, LabelHelper es interno, por lo que no podemos utilizarlo al extender nuestras propias extensiones de ayuda. –

15

Aquí tiene buddy-O:

namespace System.Web.Mvc.Html 
{ 
    using System; 
    using Collections.Generic; 
    using Linq; 
    using Linq.Expressions; 
    using Mvc; 

    public static class LabelExtensions 
    { 
    public static MvcHtmlString LabelFor<TModel, TValue>(this HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression, object htmlAttributes) 
    { 
     return html.LabelFor(expression, null, htmlAttributes); 
    } 

    public static MvcHtmlString LabelFor<TModel, TValue>(this HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression, string labelText, object htmlAttributes) 
    { 
     return html.LabelHelper(
      ModelMetadata.FromLambdaExpression(expression, html.ViewData), 
      ExpressionHelper.GetExpressionText(expression), 
      HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes), 
      labelText); 
    } 

    private static MvcHtmlString LabelHelper(this HtmlHelper html, ModelMetadata metadata, string htmlFieldName, IDictionary<string, object> htmlAttributes, string labelText = null) 
    { 
     var str = labelText 
      ?? (metadata.DisplayName 
      ?? (metadata.PropertyName 
      ?? htmlFieldName.Split(new[] { '.' }).Last())); 

     if (string.IsNullOrEmpty(str)) 
     return MvcHtmlString.Empty; 

     var tagBuilder = new TagBuilder("label"); 
     tagBuilder.MergeAttributes(htmlAttributes); 
     tagBuilder.Attributes.Add("for", TagBuilder.CreateSanitizedId(html.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(htmlFieldName))); 
     tagBuilder.SetInnerText(str); 

     return tagBuilder.ToMvcHtmlString(TagRenderMode.Normal); 
    } 

    private static MvcHtmlString ToMvcHtmlString(this TagBuilder tagBuilder, TagRenderMode renderMode) 
    { 
     return new MvcHtmlString(tagBuilder.ToString(renderMode)); 
    } 
    } 
} 
Cuestiones relacionadas