Como alterar o nome de exibição do LabelFor no razor no mvc3?

87

No motor de barbear, usei o LabelFormétodo auxiliar para exibir o nome

Mas o nome de exibição parece não ser bom. então eu preciso mudar meu nome de exibição como fazer isso ....

@Html.LabelFor(model => model.SomekingStatus, new { @class = "control-label"}) 
Farsa, falso
fonte
Esta é uma questão muito antiga, mas ainda muito relevante para a codificação MVC atual. Existem problemas com as duas soluções fornecidas até agora, então adicionei uma resposta mais detalhada cobrindo todas as 3 opções disponíveis para você.
Gone Coding em

Respostas:

160

Você pode decorar a propriedade do seu modelo de visualização com o [DisplayName]atributo e especificar o texto a ser usado:

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

Ou use outra sobrecarga do auxiliar LabelFor, que permite especificar o texto:

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

E, não, você não pode especificar um nome de classe em MVC3 como tentou fazer, pois o LabelForauxiliar não oferece suporte para isso. No entanto, isso funcionaria em MVC4 ou 5.

Darin Dimitrov
fonte
@ raj2sekar1, se está funcionando e esta resposta ajudou a resolver o problema que estava tendo, você deve considerar marcá-la como resposta clicando na marca ao lado: meta.stackexchange.com/questions/5234/…
Darin Dimitrov
8
Você precisa usar System.ComponentModel embora.
yancyn
2
Isso foi útil, obrigado. Mas acho que sua resposta seria melhor se você tivesse isso@Html.LabelFor(model => model.SomekingStatus, "something other than foo bar")
vegemite4me
2
Talvez isso tenha sido escrito há algum tempo, mas agora você pode especificar o nome da classe dentro do LabelFor: por exemplo, @ Html.LabelFor (model => model.SomekingStatus, new {@class = "your-css-class"})
ra170
3
Mas se você atualizar o banco de dados, as classes do modelo serão regeneradas e você perderá isso. Como você evita isso?
shim
30

Essa era uma pergunta antiga, mas as respostas existentes ignoram o sério problema de descartar quaisquer atributos personalizados ao regenerar o modelo. Estou adicionando uma resposta mais detalhada para cobrir as opções atuais disponíveis.

Você tem 3 opções:

  • Adicione um [DisplayName("Name goes here")]atributo à classe do modelo de dados. A desvantagem é que isso é jogado fora sempre que você regenera os modelos de dados.
  • Adicione um parâmetro de string ao seu Html.LabelFor. por exemplo, @Html.LabelFor(model => model.SomekingStatus, "My New Label", new { @class = "control-label"})Referência: https://msdn.microsoft.com/en-us/library/system.web.mvc.html.labelextensions.labelfor(v=vs.118).aspx A desvantagem disso é que você deve repetir o rótulo em cada visão.
  • Terceira opção. Use uma classe de metadados anexada à classe de dados (detalhes a seguir).

Opção 3 - Adicionar uma classe de metadados:

A Microsoft permite decorar propriedades em uma classe do Entity Framework, sem modificar a classe existente ! Isso por ter classes de metadados que se anexam às suas classes de banco de dados (efetivamente uma extensão lateral de sua classe EF). Isso permite que atributos sejam incluídos na classe associada e não na própria classe, de forma que as alterações não sejam perdidas quando você gerar novamente os modelos de dados .

Por exemplo, se sua classe de dados estiver MyModelcom uma SomekingStatuspropriedade, você poderia fazer assim:

Primeiro, declare uma classe parcial com o mesmo nome (e usando o mesmo namespace), o que permite adicionar um atributo de classe sem ser substituído:

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

Todas as classes de modelo de dados geradas são classes parciais, que permitem adicionar propriedades e métodos extras simplesmente criando mais classes com o mesmo nome (isso é muito útil e eu costumo usá-lo, por exemplo, para fornecer versões de string formatadas de outros tipos de campo no modelo )

Etapa 2: adicione uma classe de metatadados referenciada por sua nova classe parcial:

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

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

Notas:

  • Da memória, se você começar a usar uma classe de metadados, ela pode ignorar os atributos existentes na classe real ( [required]etc.), portanto, pode ser necessário duplicá-los na classe Meta-dados.
  • Isso não funciona por mágica e não funcionará apenas com qualquer classe. O código que procura os atributos de decoração da IU foi projetado para procurar primeiro uma classe de metadados.
Gone Coding
fonte
Existe algum motivo pelo qual isso não funcionaria no ASP.NET Core 3.1? [Obrigatório] funciona, mas não [DisplayName ("my label")]
John Pasquet
15

Você pode alterar o texto dos rótulos adornando a propriedade com o DisplayNameatributo.

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

Ou você pode escrever o HTML bruto explicitamente:

<label for="SomekingStatus" class="control-label">Someking Status</label>
xandercoded
fonte
1
@shim: Você realmente não deveria trabalhar diretamente com classes de modelo de banco de dados / domínio em suas visualizações, normalmente haveria uma classe intermediária de 'modelo de visualização' no meio.
Vman
exatamente o que eu estava procurando usando a sintaxe do rótulo .. Obrigado @xander
Asif Iqbal
1
O problema de "escrever o HTML bruto explicitamente" é que você mesmo terá que escrever o rótulo toda vez que usar esse formulário. Seria melhor declarar de DisplayName no modelo.
César León
4

Decore a propriedade do modelo com o atributo DisplayName.

Teppic
fonte
1

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

Anurag
fonte