Wie kann ich einem HTML-Element, das von den HTML-Helfern von MVC generiert wurde, ein Klassenattribut hinzufügen?

188

ASP.NET MVC kann HTML - Elemente mit Hilfe von HTML - Helfern, zum Beispiel erzeugen @Html.ActionLink(), @Html.BeginForm()und so weiter.

Ich weiß, dass ich Formularattribute angeben kann, indem ich ein anonymes Objekt erstelle und dieses Objekt für den (in diesem Fall vierten) htmlAttributesParameter übergebe, wobei ein idfür das Element angegeben wird:

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

Aber was ist mit dem classAttribut? Offensichtlich funktioniert das nicht:

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

Da dies nur zufällige Syntaxfehler auslöst, wenn meine Ansicht angefordert wird, weil sie nach dem Auftreten des Schlüsselworts C # etwas anderes erwartet class.

Ich habe auch versucht:

new { _class = "myclass"}

und

new { class_ = "myclass"}

Sie funktionierten aber auch nicht, da die Unterstriche durch Bindestriche ersetzt werden .

Ich weiß, dass ich die HTML-Elemente genauso gut von Hand schreiben oder das Formular in ein <div class="myClass">einbinden kann, aber ich wäre trotzdem interessiert zu wissen, wie es gemacht werden soll.

Adrian Grigore
quelle

Antworten:

348

Um einen anonymen Typ (oder einen beliebigen Typ) mit einer Eigenschaft zu erstellen, deren Name in C # ein reserviertes Schlüsselwort enthält , können Sie dem Eigenschaftsnamen ein at-Zeichen voranstellen @:

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

Für VB.NET wird diese Syntax mithilfe des Punkts ausgeführt, .der in dieser Sprache die Standardsyntax für alle anonymen Typen ist :

Html.BeginForm("Foo", "Bar", FormMethod.Post, new with { .class = "myclass" })
Gemeinschaft
quelle
Der Parser ist nicht klug genug, IMO, wenn er diesen Hinweis angesichts des Kontexts benötigt, in dem er sich an diesem Punkt im Code befindet.
Toddmo
3

Derzeitige Best Practice in der CSS-Entwicklung besteht darin, allgemeinere Selektoren mit Modifikatoren zu erstellen, die auf der gesamten Website so weit wie möglich angewendet werden können. Ich würde versuchen zu vermeiden, separate Stile für einzelne Seitenelemente zu definieren.

Wenn der Zweck der CSS-Klasse für das <form/>Element darin besteht, den Stil der Elemente im Formular zu steuern, können Sie das Klassenattribut zum vorhandenen <fieldset/>Element hinzufügen, das jedes Formular standardmäßig in von ASP.NET MVC generierten Webseiten kapselt. Eine CSS-Klasse im Formular ist selten erforderlich.

Tim
quelle
4
Sie haben sicherlich Recht, aber dieser Fall ist anders. Ich suchte nach einer Möglichkeit, Metadaten für einige jquery-Plugins anzugeben. Dies erfolgt normalerweise durch Missbrauch des Klassenattributs.
Adrian Grigore
13
Sie können Best Practices vorschlagen, aber wenn ich eine Vorlage habe, die CSS in einem Formular verwendet, werde ich die Vorlage nicht abschlachten, um sie "korrekt" zu machen. Die Realität ist, ein Kunde wird nicht mehr bezahlen, weil Sie das Richtige per CSS getan haben ...
Christian Payne
1
@ChristianPayne Sie könnten gezwungen sein, in Zukunft mehr zu zahlen, weil Sie es nicht getan haben.
Ian Warburton
1
Ich habe diese Antwort abgelehnt, weil sie die Frage nicht beantwortet. Eine angemessenere Antwort würde zuerst die Frage beantworten und dann eine Anleitung für bewährte Verfahren geben.
Ben