Como posso adicionar um atributo de classe a um elemento HTML gerado pelos HTML Helpers do MVC?

188

O ASP.NET MVC pode gerar elementos HTML usando HTML Helpers, por exemplo @Html.ActionLink(), @Html.BeginForm()e assim por diante.

Eu sei que posso especificar atributos de formulário criando um objeto anônimo e passar esse objeto para o (quarto neste caso) htmlAttributesparâmetro onde especificar um idpara o elemento:

Html.BeginForm("Foo", "Bar", FormMethod.Post, new { id = "MyForm"})

Mas e o classatributo? Obviamente isso não funciona:

Html.BeginForm("Foo", "Bar", FormMethod.Post, new { class = "myclass"})

Como isso apenas gera erros de sintaxe aleatórios quando minha visão é solicitada, porque espera outra coisa depois de encontrar a palavra-chave C # class.

Eu também tentei:

new { _class = "myclass"}

e

new { class_ = "myclass"}

Mas eles também não funcionaram, pois os sublinhados são substituídos por traços .

Eu sei que também posso escrever os elementos HTML manualmente ou agrupar o formulário dentro de um <div class="myClass">, mas ainda assim eu estaria interessado em saber como isso deve ser feito.

Adrian Grigore
fonte

Respostas:

348

Para criar um tipo anônimo (ou qualquer tipo) com uma propriedade que tenha uma palavra-chave reservada como nome em C #, você pode acrescentar o nome da propriedade com um sinal de arroba @:

Html.BeginForm("Foo", "Bar", FormMethod.Post, new { @class = "myclass"})

Para o VB.NET, essa sintaxe seria realizada usando o ponto ., que nesse idioma é a sintaxe padrão para todos os tipos anônimos :

Html.BeginForm("Foo", "Bar", FormMethod.Post, new with { .class = "myclass" })
Comunidade
fonte
O analisador não é inteligente o suficiente, IMO, se precisar dessa dica, considerando o contexto em que está naquele ponto do código.
toddmo
3

A melhor prática atual no desenvolvimento de CSS é criar seletores mais gerais com modificadores que podem ser aplicados o mais amplamente possível em todo o site. Eu tentaria evitar definir estilos separados para elementos de página individuais.

Se o objetivo da classe CSS no <form/>elemento for controlar o estilo dos elementos no formulário, você poderá adicionar ao atributo class o <fieldset/>elemento existente que encapsula qualquer formulário por padrão nas páginas da Web geradas pelo ASP.NET MVC. Uma classe CSS no formulário raramente é necessária.

Tim
fonte
4
Você certamente está certo, no entanto, este caso é diferente. Eu estava procurando uma maneira de especificar metadados para alguns plugins jquery. Isso geralmente é feito com o uso incorreto do atributo de classe.
Adrian Grigore
13
Você pode sugerir práticas recomendadas, mas se eu tiver um modelo que use css em um formulário, não irei massacrar o modelo para torná-lo "correto". A realidade é, um cliente não vai pagar mais porque você fez a coisa certa, css ...
Christian Payne
1
@ChristianPayne Eles podem ser forçados a pagar mais no futuro porque você não pagou.
Ian Warburton
1
Votei negativamente esta resposta porque ela não responde à pergunta. Uma resposta mais apropriada responderia à pergunta primeiro e depois forneceria as melhores práticas.
Ben