Warum kann ich keine HTML-Attribute an übergeben EditorFor()
? z.B;
<%= Html.EditorFor(model => model.Control.PeriodType,
new { disabled = "disabled", readonly = "readonly" }) %>
Ich möchte keine Metadaten verwenden
Update : Die Lösung bestand darin, dies aus der Sicht aufzurufen:
<%=Html.EditorFor( model => model.Control.PeriodEndDate, new {Modifiable=model.Control.PeriodEndDateModifiable})%>
und ViewData["Modifiable"]
in meiner benutzerdefinierten EditorTemplates / String.ascx verwenden, wo ich eine Ansichtslogik habe, die bestimmt, ob schreibgeschützte und / oder deaktivierte Attribute zur Eingabe hinzugefügt werden sollen. Das übergebene anonyme Objekt EditorFor()
ist ein Parameter, der aufgerufen wird, additionalViewData
und seine Eigenschaften werden an die Editorvorlage in der übergeben ViewData
Sammlung.
html
asp.net-mvc
editorfor
Tippfehler Johnson
quelle
quelle
Antworten:
EditorFor
funktioniert mit Metadaten. Wenn Sie also HTML-Attribute hinzufügen möchten, können Sie dies jederzeit tun . Eine andere Möglichkeit besteht darin, einfach eine benutzerdefinierte Vorlage zu schreiben und Folgendes zu verwendenTextBoxFor
:quelle
PeriodType
? Ist es nicht eine einfache Eigenschaft? Wenn es sich um ein komplexes Objekt ist , könnte man konnte die ganze Vorlage anpassen , indem Sie eine Teil platzieren ,~/Views/ControllerName/EditorTemplates/SomeType.ascx
woSomeType
der Name des Typs istPeriodType
Eigentum.@class
sinnlos, eine Editorvorlage zu definieren , die beispielsweise 3 Divs enthält. Mit dem Html.TextBoxFor-Helfer können Sie dies definieren, da Sie wissen, was dieser Helfer generiert - ein Textfeld, daher ist es sinnvoll, eine Klasse für ein Eingabeelement zu definieren.Das Update MVC 5.1 unterstützt jetzt den folgenden Ansatz direkt, sodass es auch für den integrierten Editor funktioniert. http://www.asp.net/mvc/overview/releases/mvc51-release-notes#new-features (Es ist entweder ein Fall von großartigem Denken oder sie lesen meine Antwort :)
Update beenden
Wenn Sie Ihre eigene Editor-Vorlage oder MVC 5.1 verwenden, das jetzt den folgenden Ansatz direkt für integrierte Editoren unterstützt.
dann in Ihrer Vorlage (nicht erforderlich für einfache Typen in MVC 5.1)
quelle
Ab MVC 5.1 können Sie jetzt Folgendes tun:
http://www.asp.net/mvc/overview/releases/mvc51-release-notes#new-features
quelle
EditorFor
Standardvorlagen. Wenn Sie Ihre eigenen implementieren, müssen Sie der Antwort von AntonK folgen.Jetzt hat ASP.Net MVC 5.1 eine integrierte Unterstützung dafür erhalten.
Aus den Versionshinweisen
Beispielsweise:
quelle
Hier ist die VB.Net-Codesyntax für HTML-Attribute in MVC 5.1 EditorFor
quelle
Warum nicht einfach benutzen
quelle
Wenn Sie keine Metadaten verwenden möchten, können Sie
[UIHint("PeriodType")]
die Eigenschaft mit einem Attribut dekorieren, oder wenn es sich um einen komplexen Typ handelt, müssen Sie nichts dekorieren. EditorFor sucht dann im EditorTemplates-Ordner nach einer PeriodType.aspx- oder ASCX-Datei und verwendet diese stattdessen.quelle
Ich habe heute mit dem gleichen Problem um ein Kontrollkästchen gerungen, das an einen nullbaren Bool gebunden ist, und da ich mein Modell (nicht meinen Code) nicht ändern kann, musste ich mir eine bessere Methode ausdenken, um damit umzugehen. Es ist ein bisschen rohe Gewalt, aber es sollte in 99% der Fälle funktionieren, denen ich begegnen könnte. Sie müssten natürlich eine manuelle Auffüllung gültiger Attribute für jeden Eingabetyp durchführen, aber ich glaube, ich habe alle für das Kontrollkästchen erhalten.
In meiner Boolean.cshtml-Editorvorlage:
quelle
Dictionary<string,string> attribs = new Dictionary<string,string>();
undattribs.Add("tabindex","16");
in einem dieser@( )
Blöcke oben auf meiner Seite hinzugefügt . Dann habe ich@Html.CheckBox("IsActive", Model.IsActive.HasValue ? Model.IsActive : false, attribs)
auf meiner Seite und es gibt mir eine Fehlermeldung: "'System.Web.Mvc.HtmlHelper <MyProject.Models.MyObject>' enthält keine Definition für 'CheckBox' und die beste Erweiterungsmethode Überladung 'System.Web. Mvc.InputExtensions.CheckBox (System.Web.Mvc.HtmlHelper, string.bool, object) 'hat einige ungültige Argumente ".Sie können EditorFor weiterhin verwenden. Übergeben Sie einfach das HTML-Attribut style / whichever als ViewData.
Da EditorFor zum Rendern Vorlagen verwendet, können Sie die Standardvorlage für Ihre Eigenschaft überschreiben und das Stilattribut einfach als ViewData übergeben.
Ihre EditorTemplate möchte also Folgendes:
quelle
Sie können so verwenden; gleiche Ausgabe mit
Html.EditorFor
, und Sie können Ihre HTML-Attribute hinzufügenquelle
TextBoxFor
ignoriert jede Art von demDisplayFormat
, was Sie möglicherweise anwenden möchten.Erstellen Sie einfach Ihre eigene Vorlage für den Typ in Views / Shared / EditorTemplates / MyTypeEditor.vbhtml
Rufen Sie den Editor aus Ihrer Ansicht mit der Modelleigenschaft auf:
Verzeihen Sie die VB-Syntax. So rollen wir.
quelle
In meinem Fall habe ich versucht, eine HTML5-Eingabe-Editor-Vorlage zu erstellen, die zusätzliche Attribute erhalten kann. Ein besserer Ansatz wäre es, einen eigenen HTML-Helfer zu schreiben. Da ich jedoch bereits meine .ascx-Vorlage hatte, habe ich mich für diesen Ansatz entschieden:
Dieses hässliche Bit erstellt eine Eingabe vom Typ Zahl und sucht nach einem ViewData-Wörterbuch mit dem Schlüssel "Attribute". Es wird das Wörterbuch durchlaufen und seine Schlüssel / Wert-Paare als Attribute hinzufügen. Der Regex im ID-Attribut hat keine Beziehung und ist vorhanden, da bei Verwendung in einer Sammlung
GetFullHtmlFieldId()
eine ID mit eckigen Klammern zurückgegeben wird,[]
die normalerweise als Unterstriche maskiert wird.Diese Vorlage heißt dann wie folgt:
Ausführlich, aber es funktioniert. Sie könnten wahrscheinlich die Reflektion in der Vorlage verwenden, um Eigenschaftsnamen als Attributnamen zu verwenden, anstatt ein Wörterbuch zu verwenden.
quelle
Stellen Sie die Bedingung mit
ViewData
in der Steuerung einVerwenden Sie dann diese Ansichtsdaten in der Editorvorlage, um das HTML-Attribut des Steuerelements festzulegen
quelle
MVC 5.1 und eine höhere Lösung (führt lokale HtmlAttributes zusammen und wird in den EditorTemplates definiert):
Shared \ EditorTemplates \ String.cshtml:
Erweiterungen:
Verwendung:
quelle
source1
undsource2
as _ durch - ersetzen mussteIDictionary<string, object>
. Ich habe diese Funktion gemacht:private static IDictionary<string, object> ToHtmlAttributesDictionary(this IEnumerable<KeyValuePair<string, object>> dico) { return dico.ToDictionary(s => s.Key.Replace('_', '-'), s => s.Value); }