Angenommen, ich habe ViewModel wie
public class AnotherViewModel
{
public string Name { get; set; }
}
public class MyViewModel
{
public string Name { get; set; }
public AnotherViewModel Child { get; set; }
public AnotherViewModel Child2 { get; set; }
}
In der Ansicht kann ich einen Teil mit rendern
<% Html.RenderPartial("AnotherViewModelControl", Model.Child) %>
Im Teil werde ich tun
<%= Html.TextBox("Name", Model.Name) %>
or
<%= Html.TextBoxFor(x => x.Name) %>
Das Problem ist jedoch, dass beide name = "Name" rendern, während name = "Child.Name" erforderlich ist, damit der Modellordner ordnungsgemäß funktioniert. Oder name = "Child2.Name", wenn ich die zweite Eigenschaft mit derselben Teilansicht rendere.
Wie lasse ich meine Teilansicht das erforderliche Präfix automatisch erkennen? Ich kann es als Parameter übergeben, aber das ist zu unpraktisch. Dies ist noch schlimmer, wenn ich es beispielsweise rekursiv rendern möchte. Gibt es eine Möglichkeit, Teilansichten mit einem Präfix oder, noch besser, mit einer automatischen Neukonfiguration des aufrufenden Lambda-Ausdrucks zu rendern?
<% Html.RenderPartial("AnotherViewModelControl", Model.Child) %>
fügt automatisch das richtige "Kind" hinzu. Präfix zu den generierten Name / ID-Zeichenfolgen?
Ich kann jede Lösung akzeptieren, einschließlich View Engine und Bibliotheken von Drittanbietern. Ich verwende tatsächlich Spark View Engine (ich "löse" das Problem mithilfe seiner Makros) und MvcContrib, habe dort jedoch keine Lösung gefunden. XForms, InputBuilder, MVC v2 - jedes Tool / jede Erkenntnis, die diese Funktionalität bietet, ist großartig.
Momentan denke ich darüber nach, dies selbst zu codieren, aber es scheint Zeitverschwendung zu sein. Ich kann nicht glauben, dass dieses triviale Zeug noch nicht implementiert ist.
Möglicherweise gibt es viele manuelle Lösungen, und alle sind willkommen. Zum Beispiel kann ich erzwingen, dass meine Partials auf IPartialViewModel <T> {public string Prefix; T-Modell; }. Aber ich würde lieber eine bestehende / genehmigte Lösung bevorzugen.
UPDATE: es gibt eine ähnliche Frage ohne Antwort hier .
quelle
helper.ViewData.TemplateInfo.HtmlFieldPrefix
in Form von{oldprefix}.{newprefix}
new ViewDataDictionary(helper.ViewData)
mitnew ViewDataDictionary(((HtmlHelper)helper).ViewData)
. Sehen Sie ein Problem damit?string oldPrefix = helper.ViewData.TemplateInfo.HtmlFieldPrefix; if (oldPrefix != "") name = oldPrefix + "." + name;
Bisher habe ich nach dem gesucht, was ich in diesem letzten Beitrag gefunden habe:
http://davybrion.com/blog/2011/01/prefixing-input-elements-of-partial-views-with-asp-net-mvc/
quelle
ViewDataDictionary
Konstruktor verwenden, der den aktuellen verwendetViewData
, oder Sie verlieren Modellstatusfehler, Validierungsdaten usw.Meine Antwort basiert auf der Antwort von Mahmoud Moravej, einschließlich des Kommentars von Ivan Zlatev.
Bearbeiten: Die Antwort von Mohamoud ist für verschachteltes partielles Rendern falsch. Sie müssen das neue Präfix nur dann an das alte Präfix anhängen, wenn dies erforderlich ist. Dies war in den letzten Antworten nicht klar (:
quelle
Mit MVC2 können Sie dies erreichen.
Hier ist die stark typisierte Ansicht:
Hier ist die stark typisierte Ansicht für die untergeordnete Klasse (die in einem Unterordner des Ansichtsverzeichnisses namens EditorTemplates gespeichert werden muss):
Hier ist der Controller:
Hier sind die benutzerdefinierten Klassen:
Und die Ausgabequelle:
Nun ist dies abgeschlossen. Legen Sie in der Aktion "Post-Controller erstellen" einen Haltepunkt fest, um dies zu überprüfen. Verwenden Sie dies jedoch nicht mit Listen, da dies nicht funktioniert. Weitere Informationen hierzu finden Sie in meiner Frage zur Verwendung von EditorTemplates mit IEnumerable.
quelle
Html.EditorFor
Methode zum Rendern des untergeordneten Formulars. Genau dafür sollen Editor-Vorlagen verwendet werden. Dies sollte die Antwort sein.Dies ist eine alte Frage, aber für alle, die hier ankommen und nach einer Lösung suchen, sollten Sie die Verwendung in Betracht ziehen
EditorFor
, wie in einem Kommentar unter https://stackoverflow.com/a/29809907/456456 vorgeschlagen . Führen Sie die folgenden Schritte aus, um von einer Teilansicht zu einer Editorvorlage zu wechseln.Stellen Sie sicher, dass Ihre Teilansicht an ComplexType gebunden ist .
Verschieben Sie Ihre Teilansicht in einen Unterordner EditorTemplates des aktuellen Ansichtsordners oder in den Ordner Shared . Jetzt ist es eine Editorvorlage.
Wechseln Sie
@Html.Partial("_PartialViewName", Model.ComplexType)
zu@Html.EditorFor(m => m.ComplexType, "_EditorTemplateName")
. Die Editorvorlage ist optional, wenn sie die einzige Vorlage für den komplexen Typ ist.HTML-Eingabeelemente werden automatisch benannt
ComplexType.Fieldname
.quelle
PartailFor für asp.net Core 2, falls jemand es braucht.
quelle
Ich bin auch auf dieses Problem gestoßen, und nach viel Mühe fand ich, dass es einfacher war, meine Schnittstellen so zu gestalten, dass ich keine verschachtelten Modellobjekte zurückschicken musste. Dies zwang mich, meine Workflows für die Benutzeroberfläche zu ändern: Natürlich muss der Benutzer jetzt in zwei Schritten das tun, wovon ich geträumt habe, aber die Benutzerfreundlichkeit und Wartbarkeit des Codes des neuen Ansatzes ist für mich jetzt von größerem Wert.
Hoffe das hilft einigen.
quelle
Sie können einen Helfer für das RenderPartial hinzufügen, der das Präfix übernimmt und es in die ViewData einfügt.
Dann ein weiterer Helfer, der den ViewData-Wert verkettet
und so in der Ansicht ...
in der partiellen ...
quelle
Wie Sie füge ich meinen ViewModels die Präfix-Eigenschaft (eine Zeichenfolge) hinzu, die ich vor meinen modellgebundenen Eingabenamen anhänge. (YAGNI verhindert das Folgende)
Eine elegantere Lösung könnte ein Basisansichtsmodell mit dieser Eigenschaft und einige HtmlHelper sein, die prüfen, ob das Ansichtsmodell von dieser Basis abgeleitet ist, und in diesem Fall das Präfix an den Eingabenamen anhängen.
Hoffentlich hilft das,
Dan
quelle
Wie wäre es kurz bevor Sie RenderPartial aufrufen?
Dann haben Sie in Ihrem Teil
quelle