2011-06-06 12 views
15

Duplicar posibles:
Client Id for Property (ASP.Net MVC)Cómo especificar el ID para un Html.LabelFor <> (MVC Razor)

¿Hay una manera de hacer que la maquinilla de afeitar hacen un atributo ID de etiqueta elemento cuando se utiliza Html.LabelFor <> helper?

Ejemplo:

.cshtml page 
@using (Html.BeginForm()) 
{ 
@Html.LabelFor(m => m.Foo) 
@Html.TextBoxFor(m => m.Foo) 
} 

Página mostrada

<form ...> 
<label for="Foo" id="Label_Foo" /> 
<input type="text" name="Foo" id="Foo" /> 
</form> 

FYI - La única razón por la que estoy queriendo añadir un ID de la etiqueta es para el diseño CSS. Preferiría hacer referencia a la etiqueta mediante una identificación en lugar de envolver la etiqueta dentro de un bloque (es decir, div) y luego diseñar el bloque.

+0

¿por qué tiene que hacer m => m.Foo por qué no sólo m.Foo – Nikos

+0

Porque tiene que insertar una expresión que se puede leer en lugar de insertar un valor. –

Respuesta

26

Desafortunadamente no hay una sobrecarga incorporada de este asistente que le permita lograr esto.

Afortunadamente se necesitaría un par de líneas de código para implementar su propio:

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

    private static MvcHtmlString LabelHelper(
     HtmlHelper html, 
     ModelMetadata metadata, 
     string htmlFieldName, 
     object htmlAttributes 
    ) 
    { 
     string resolvedLabelText = metadata.DisplayName ?? metadata.PropertyName ?? htmlFieldName.Split('.').Last(); 
     if (string.IsNullOrEmpty(resolvedLabelText)) 
     { 
      return MvcHtmlString.Empty; 
     } 

     TagBuilder tag = new TagBuilder("label"); 
     tag.Attributes.Add("for", TagBuilder.CreateSanitizedId(html.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(htmlFieldName))); 
     tag.MergeAttributes(new RouteValueDictionary(htmlAttributes)); 
     tag.SetInnerText(resolvedLabelText); 
     return MvcHtmlString.Create(tag.ToString(TagRenderMode.Normal)); 
    } 
} 

y una vez puesto en ámbito usar este helper en su opinión:

@Html.LabelFor(m => m.Foo, new { id = "Foo" }) 
@Html.TextBoxFor(m => m.Foo) 

Observación: porque ahora Depende de usted administrar los ID de HTML, asegúrese de que sean únicos en todo el documento.

Remark2: plagio y modifico descaradamente el método LabelHelper del código fuente de ASP.NET MVC 3.

+0

Una buena respuesta, gracias por hacer el trabajo preliminar en esto. – camainc

+1

Este método es compatible con las últimas versiones de MVC sin la extensión. – Todd

1

y para la etiqueta normal de @Html.Label()

se puede hacer eso y fácil de código de una línea ...

public static HtmlString Label(this HtmlHelper helper, string target = "", string text = "", string id = "") 
{ 
    return new HtmlString(string.Format("<label id='{0}' for='{1}'>{2}</label>", id, target, text)); 
} 
Cuestiones relacionadas