Frage

Ich habe das, was für mich erscheint (sowieso) ein seltsames Problem zu sein ...

Ich habe eine einfache Editor -Vorlage für eine Selektionslistitem (selektionslistitem.cshtml im Ordner ~/views/Shared/editortemplates) zum Beispiel:

<ul class="select-list-item cell-15 col-3 omega clearfix">
    @Html.EditorFor(c => c.Categories)
</ul>

Wo C.Categories ein iEnumerable ist

Dies hat gut funktioniert, aber ich wollte eine weitere Vorlage, um die Sammlung mit etwas anderem Markup zu rendern. Deshalb habe ich die Editor -Vorlage kopiert und umbenannt, beispielsweise in "categoryicons.cshtm" und wie folgt aufgerufen:

<ul class="select-list-item cell-15 col-3 omega clearfix">
    @Html.EditorFor(c => c.Categories, "CategoryIcons")
</ul>

Kurz gesagt, der einzige Unterschied besteht darin, dass ich eine benannte Editor -Vorlage angibt.

Wenn ich die Seite öffne, erhalte ich jetzt den folgenden Fehler:

Das in das Wörterbuch übergebene Modellelement ist vom Typ 'system.collectionss.generic.list`1 [System.Web.Mvc.SelectListItem]'. Dieses Wörterbuch erfordert jedoch ein Modellelement vom Typ 'system.web.mvc.SelectListItem' '

Die Modellerklärung der Vorlage in beiden Vorlagen -ID:

@model System.Web.Mvc.SelectListItem

Ich verstehe nicht, warum die Standardvorlage funktioniert und die benannte Vorlage nicht. Jede Hilfe wäre geschätzt.

Vielen Dank.

War es hilfreich?

Lösung

Wenn du anrufst @Html.EditorFor(c => c.Categories) Es fällt auf die Standardvorlage für iEnumerable zurück. Diese Standardvorlage wird vom MVC -Framework bereitgestellt, und ihr Verhalten besteht darin, auszugeben Html.EditorFor() Für jeden Artikel in der Aufzählung. Dass wiederum die entsprechende Editor -Vorlage für jedes Element in der Liste einzeln ausgibt - in Ihrem Fall sind sie alle Instanzen von SelectListItem, also im ersten Fall die SelectListItem Die Vorlage wird für jedes Element verwendet.

Im zweiten Fall durch explizit Einstellen Ihrer EditorFor Verwenden einer bestimmten Editor -Vorlage CategoryIcons, Sie fordern es an, diese Editor -Vorlage für die zu verwenden ganze Aufzählung, Anstatt zuzulassen, dass das Aufzählung standardmäßig beschimpft werden kann, verwenden Sie wiederum die Vorlage für jedes aufgezählte Element.

Ich bin mir noch nicht sicher, wie es am besten in der Nähe ist.

Ein Ansatz wäre, a zu definieren CategoryIcons Vorlage, deren Modell eine Instanz von ist IEnumerable<CategoryIcon>, was einfach für die Model Aufzählung und führt durch Html.EditorFor Für jedes Element mit einer expliziten Vorlagereferenz von CategoryIcon. Sie setzen dann Ihre Per-Element-Editor-Vorlage in diese Vorlage (CategoryIcon nicht CategoryIcons). Sie würden das dann nennen, indem Sie dies tun @Html.EditorFor(c => c.Categories, "CategoryIcons").

Ich werde mich umsehen, um zu sehen, ob es bessere Möglichkeiten gibt, dies zu erledigen, aber ich hoffe, dass dies vorerst nützlich sein könnte. Es wäre großartig, wenn Vorlagen parametrisiert werden könnten, sodass Sie eine iEnumerable Vorlage schreiben könnten, die als Argument den Namen der Vorlage für jedes seiner Elemente verwendet.

Andere Tipps

Nur ein Update, ich bin über diese Frage gestoßen, um das gleiche Problem selbst anzugehen.

Was ich am Ende getan habe, war die Iteration in jeder Instanz der Sammlung und den Aufruf der Edtor für individuell wie folgt:

<ul class="select-list-item cell-15 col-3 omega clearfix">
    @for (int i=0;i<Model.Categories.Count;i++) {
        @Html.EditorFor(c => c.Categories[i], "CategoryIcons")
    }
</ul>

Immer noch nicht sauber, aber ich mag es besser, als eine neue Klasse zu erben, wie du es letztendlich taten.

(Entschuldigung, wenn meine C# -Syntax ein wenig ausgeschaltet ist, schreibe ich in vb.net)

Wenn Sie Editor For verwenden, denke ich nicht, dass die Looping -Lösung funktioniert. Es scheint, dass die Verwendung der IEnumerable -Vorlage die einzige Möglichkeit ist, dass die Formulareingänge korrekt benannt werden. Wenn Sie nur wiederholt Editor for anrufen, dann Ihr Formular <INPUT>S hat eher die gleiche ID als indexierte IDs.

Ich habe dieses Problem und die erlebt Lösung war die aufzählbare Vorlage auszugeben und nicht Schaufeln Sie die Listenelemente durch.

Es tut mir leid, dass dies zu einer Antwort, nicht zu einem Kommentar - keine Kommentarrechte.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top