¿Cómo cambiar el nombre para mostrar de LabelFor en razor en mvc3?


87

En el motor de afeitar, he usado el LabelFormétodo auxiliar para mostrar el nombre

Pero el nombre para mostrar parece no ser bueno para mostrar. así que necesito cambiar mi nombre para mostrar cómo hacerlo ...

@Html.LabelFor(model => model.SomekingStatus, new { @class = "control-label"}) 

Esta es una pregunta muy antigua, pero aún muy relevante para la codificación MVC actual. Hay problemas con las dos soluciones proporcionadas hasta ahora, por lo que agregué una respuesta más detallada que cubre las 3 opciones disponibles.
Gone Coding

Respuestas:


160

Puede decorar la propiedad de su modelo de vista con el [DisplayName]atributo y especificar el texto que se utilizará:

[DisplayName("foo bar")]
public string SomekingStatus { get; set; }

O use otra sobrecarga del ayudante LabelFor que le permite especificar el texto:

@Html.LabelFor(model => model.SomekingStatus, "foo bar")

Y no, no puede especificar un nombre de clase en MVC3 como intentó hacerlo, ya que el LabelForayudante no lo admite. Sin embargo, esto funcionaría en MVC4 o 5.


@ raj2sekar1, si está funcionando y esta respuesta lo ayudó a resolver el problema que tenía, debería considerar marcarlo como respuesta haciendo clic en la marca de verificación al lado: meta.stackexchange.com/questions/5234/…
Darin Dimitrov

8
Sin embargo, debe usar System.ComponentModel.
yancyn

2
Esto fue útil, gracias. Pero creo que su respuesta sería mejor si tuviera esto en su lugar@Html.LabelFor(model => model.SomekingStatus, "something other than foo bar")
vegemite4me

2
Quizás esto se escribió hace un tiempo, pero ahora puede especificar el nombre de la clase dentro de LabelFor: por ejemplo, @ Html.LabelFor (model => model.SomekingStatus, new {@class = "your-css-class"})
ra170

3
Pero si actualiza la base de datos, las clases de modelo se regeneran y pierde esto. ¿Cómo evitas eso?
calzar el

30

Esta era una pregunta antigua, pero las respuestas existentes ignoran el grave problema de desechar cualquier atributo personalizado cuando regenera el modelo. Estoy agregando una respuesta más detallada para cubrir las opciones disponibles actualmente.

Tienes 3 opciones:

  • Agregue un [DisplayName("Name goes here")]atributo a la clase del modelo de datos. La desventaja es que esto se desecha cada vez que regenera los modelos de datos.
  • Agregue un parámetro de cadena a su Html.LabelFor. por ejemplo, @Html.LabelFor(model => model.SomekingStatus, "My New Label", new { @class = "control-label"})Referencia: https://msdn.microsoft.com/en-us/library/system.web.mvc.html.labelextensions.labelfor(v=vs.118).aspx La desventaja de esto es que debe repetir la etiqueta en cada vista.
  • Tercera opción. Utilice una clase de metadatos adjunta a la clase de datos (se detallan a continuación).

Opción 3: agregar una clase de metadatos:

Microsoft permite decorar propiedades en una clase de Entity Framework, ¡ sin modificar la clase existente ! Esto al tener clases de metadatos que se adjuntan a las clases de su base de datos (efectivamente, una extensión lateral de su clase EF). Esto permite que los atributos se agreguen a la clase asociada y no a la clase en sí para que los cambios no se pierdan cuando se regeneran los modelos de datos .

Por ejemplo, si su clase de datos está MyModelcon una SomekingStatuspropiedad, podría hacerlo así:

Primero declare una clase parcial del mismo nombre (y usando el mismo espacio de nombres), lo que le permite agregar un atributo de clase sin ser anulado:

[MetadataType(typeof(MyModelMetaData))]
public partial class MyModel
{
}

Todas las clases de modelo de datos generadas son clases parciales, que le permiten agregar propiedades y métodos adicionales simplemente creando más clases con el mismo nombre (esto es muy útil y a menudo lo uso, por ejemplo, para proporcionar versiones de cadenas formateadas de otros tipos de campos en el modelo ).

Paso 2: agregue una clase de metadatos a la que haga referencia su nueva clase parcial:

public class MyModelMetaData
{
    // Apply DisplayNameAttribute (or any other attributes)
    [DisplayName("My New Label")]
    public string SomekingStatus;
}

Referencia: https://msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations.metadatatypeattribute(v=vs.110).aspx

Notas:

  • Desde la memoria, si comienza a usar una clase de metadatos, puede ignorar los atributos existentes en la clase real ( [required]etc.), por lo que es posible que deba duplicarlos en la clase de metadatos .
  • Esto no funciona por arte de magia y no solo funcionará con ninguna clase. El código que busca los atributos de decoración de la interfaz de usuario está diseñado para buscar primero una clase de metadatos.

¿Hay alguna razón por la que esto no funcione en ASP.NET Core 3.1? [Obligatorio] funciona, pero no [DisplayName ("mi etiqueta")]
John Pasquet

15

Puede cambiar el texto de las etiquetas adornando la propiedad con el DisplayNameatributo.

[DisplayName("Someking Status")]
public string SomekingStatus { get; set; }

O puede escribir el HTML sin procesar explícitamente:

<label for="SomekingStatus" class="control-label">Someking Status</label>

1
@shim: Realmente no debería trabajar directamente con las clases de modelo de base de datos / dominio en sus vistas, normalmente habría una clase intermedia de 'modelo de vista' en el medio.
Vman

Exactamente lo que estaba buscando usando la sintaxis de la etiqueta. Gracias @xander
Asif Iqbal

1
El problema con "escribir el HTML sin formato explícitamente" es que tendrá que escribir la etiqueta usted mismo cada vez que use ese formulario. Sería mejor declarar DisplayName en el modelo.
César León

4

Decora la propiedad del modelo con el atributo DisplayName.


1

@ Html.LabelFor (model => model.SomekingStatus, "foo bar")

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.