¿Cómo puedo agregar un atributo de clase a un elemento HTML generado por HTML Helpers de MVC?

188

ASP.NET MVC puede generar elementos HTML utilizando HTML Helpers, por ejemplo @Html.ActionLink(), @Html.BeginForm()etc.

Sé que puedo especificar atributos de formulario creando un objeto anónimo y pasar ese objeto para el htmlAttributesparámetro (cuarto en este caso) al especificar un idpara el elemento:

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

¿Pero qué hay del classatributo? Obviamente esto no funciona:

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

Como eso solo arroja errores de sintaxis aleatorios cuando se solicita mi vista, porque espera algo más después de encontrar la palabra clave C # class.

También he intentado:

new { _class = "myclass"}

y

new { class_ = "myclass"}

Pero tampoco funcionaron, ya que los guiones bajos son reemplazados por guiones .

Sé que también puedo escribir los elementos HTML a mano o envolver el formulario dentro de un <div class="myClass">, pero todavía estaría interesado en saber cómo se supone que debe hacerse.

Adrian Grigore
fuente

Respuestas:

348

Para crear un tipo anónimo (o cualquier tipo) con una propiedad que tenga una palabra clave reservada como nombre en C #, puede anteponer el nombre de la propiedad con un signo at @:

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

Para VB.NET, esta sintaxis se lograría utilizando el punto ., que en ese idioma es la sintaxis predeterminada para todos los tipos anónimos :

Html.BeginForm("Foo", "Bar", FormMethod.Post, new with { .class = "myclass" })
Comunidad
fuente
El analizador no es lo suficientemente inteligente, en mi opinión, si necesita esa pista dado el contexto en el que se encuentra en ese punto del código.
toddmo
3

La mejor práctica actual en el desarrollo de CSS es crear selectores más generales con modificadores que puedan aplicarse lo más ampliamente posible en todo el sitio web. Intentaría evitar definir estilos separados para elementos de página individuales.

Si el propósito de la clase CSS en el <form/>elemento es controlar el estilo de los elementos dentro del formulario, puede agregar al atributo de clase el <fieldset/>elemento existente que encapsula cualquier formulario de forma predeterminada en las páginas web generadas por ASP.NET MVC. Una clase de CSS en el formulario rara vez es necesaria.

Tim
fuente
44
Ciertamente tienes razón, sin embargo, este caso es diferente. Estaba buscando una manera de especificar metadatos para algunos complementos de jquery. Esto generalmente se hace mediante el mal uso del atributo de clase.
Adrian Grigore
13
Puede sugerir las mejores prácticas, pero si tengo una plantilla que usa CSS en un formulario, no voy a ir a cortar la plantilla para que sea "correcta". La realidad es que un cliente no va a pagar más porque hizo lo correcto por CSS ...
Christian Payne
1
@ChristianPayne Pueden verse obligados a pagar más en el futuro porque usted no lo hizo.
Ian Warburton
1
He rechazado esta respuesta porque no responde la pregunta. Una respuesta más apropiada respondería primero a la pregunta y luego daría una guía de mejores prácticas.
Ben