2011-12-07 11 views
7

He creado plantillas de editor y plantillas de visualización personalizadas. He colocado cada uno de estos tipos en una carpeta dentro de mi carpeta de vistas. Las carpetas se denominaron EditorTemplate o DisplayTemplate, según el tipo de plantilla que se haya creado.Plantillas de pantalla MVC3

Entonces, ahora puedo usar EditorFor para usar mi plantilla de editor personalizado, o DisplayFor para mi plantilla de editor personalizado.

Me gustaría crear una plantilla personalizada para un LabelFor, pero no he encontrado un ejemplo de esto. ¿Crearía una carpeta llamada Labeltemplate en mi carpeta Views y la agregaría aquí?

ACTUALIZACIÓN

La razón por la que estaba tratando de extender el LabelFor era para manejar una propiedad que es de tipo KeyValuePair. Quiero usar la clave de esta propiedad como la etiqueta y el valor como la pantalla. Hice una pregunta here sobre el DisplayFor para manejar el valor.

Mi solución terminó como>

@Html.DisplayFor(m => m.MyProperty, @Model.MyProperty.Key) 

Gracias,

Respuesta

6

LabelFor no utiliza ningún plantillas. Está codificado en el código fuente de MVC y escupe un <label> sin importar lo que hagas.

Tendrá que escribir un helper html personalizado si desea modificar este comportamiento.

Por otro lado, si desea utilizar plantillas, debe utilizar EditorFor/DisplayFor helpers. Por lo tanto, dado que una etiqueta es para propósitos de exhibición, puede usar una plantilla de visualización y en lugar de usar Html.LabelFor(x => x.Foo), use Html.DisplayFor(x => x.Foo). En lo que respecta a la plantilla personalizada, puede decorar la propiedad Foo con el atributo [UIHint] o pasarla como segundo argumento al ayudante DisplayFor.


ACTUALIZACIÓN:

De acuerdo con su comentario que no están tratando de modificar el margen de beneficio, pero sólo el valor. Eso es lo que el segundo argumento del helper LabelFor podría utilizarse para:

@Html.LabelFor(x => x.Foo, Model.Key) 
@Html.EditorFor(x => x.Foo) 

Esto crea una etiqueta que se asocia con la entrada de Foo (for atributo de la etiqueta correctamente asignado) pero el texto que se muestra es la de la Key propiedad en su modelo de vista.

+0

Estoy bien con la etiqueta, pero me gustaría establecer el texto interno de la etiqueta a un valor distinto lo que usa el ayudante Mi propiedad es un par de valores clave, y me gustaría establecer la etiqueta a la 'Clave' de la propiedad. ¿Alguna idea? –

+0

Tenga cuidado al usar "DisplayFor". Su solución funcionaría, pero el DisplayFor estaba destinado a ser utilizado para crear una visualización de "solo lectura" de un valor y no para crear una etiqueta para la propiedad. Con esto quiero decir que se usaría un DisplayFor para "DateTime" para personalizar el formato en que se mostraba la hora de los datos. Una plantilla "DisplayFor" para su modelo o clase personalizada arrojaría valores. –

+0

Tal vez codifique la etiqueta y no use un ayudante. –

2

No se admite la creación de una plantilla para un método específico de HTML Helper (LabelFor).

Usted podría:

marcado de su modelo usando descriptores de metadatos para cambiar el valor que se muestra como parte de la etiqueta:

[DisplayName("Custom Label")] 
public string Test {get;set;} 

Se puede crear su propio método personalizado HTML Helper para desgarrador a cabo una etiqueta :

How can I override the @Html.LabelFor template?

+0

Probé la solución ofrecida en esa pregunta, pero necesitaba el valor 'Key' de mi propiedad KeyValuePair. Su pregunta se refería al formato de la etiqueta (se agregó una etiqueta span). –

+0

El código en esa publicación no era una "solución final" para usted, no era la intención darle el código básico para crear un HTML Helper que pudiera hacer lo que usted quisiera. –

+0

Me dio lo básico, pero me faltaba un elemento clave, el valor de la propiedad. Parecía que el código solo funcionaba con los metadatos de la propiedad, pero no el valor. Eso era todo lo que realmente necesitaba, pero no estaba seguro de si estaba disponible. –

1

se puede crear un DisplayTemplate y acceder a ella a través de nombre de la plantilla:

@Html.DisplayFor(x => x.Foo, "label") 

Y luego simplemente cree una plantilla llamada label.cshtml en su carpeta DisplayTemplates.

Para simplificar esta llamada, puede escribir un método de extensión que se encarga de esta llamada:

public static MvcHtmlString TemplateLabelFor<TModel, TProperty>(this HtmlHelper<TModel> html, Expression<Func<TModel, TProperty>> property) 
{ 
    return html.DisplayFor(property, "label"); 
}