Normalerweise gehören die Ansichten zu einem bestimmten passenden Controller , der seine Datenanforderungen unterstützt, oder die Ansicht gehört in den Views/Shared
Ordner, wenn sie von Controllern gemeinsam genutzt wird (daher der Name).
"Antwort" (aber nicht empfohlen - siehe unten):
Sie können auf Ansichten / Teilansichten eines anderen Controllers verweisen, indem Sie den vollständigen Pfad (einschließlich der Erweiterung) wie folgt angeben:
return PartialView("~/views/ABC/XXX.cshtml", zyxmodel);
oder ein relativer Pfad (keine Erweiterung), basierend auf der Antwort von @Max Toro
return PartialView("../ABC/XXX", zyxmodel);
ABER DAS IST KEINE GUTE IDEE
* Hinweis: Dies sind die einzigen zwei Syntaxen, die funktionieren . nicht ABC\\XXX
oder ABC/XXX
oder irgendeine andere Variation, da dies alles relative Pfade sind und keine Übereinstimmung finden.
Bessere Alternativen:
Sie können Html.Renderpartial
stattdessen in Ihrer Ansicht verwenden, es ist jedoch auch die Erweiterung erforderlich:
Html.RenderPartial("~/Views/ControllerName/ViewName.cshtml", modeldata);
Verwendung @Html.Partial
für die Inline-Razor-Syntax:
@Html.Partial("~/Views/ControllerName/ViewName.cshtml", modeldata)
Sie können die ../controller/view
Syntax ohne Erweiterung verwenden (erneut @Max Toro):
@Html.Partial("../ControllerName/ViewName", modeldata)
Hinweis: Anscheinend RenderPartial
ist etwas schneller als Partial, aber das ist nicht wichtig.
Wenn Sie den anderen Controller tatsächlich aufrufen möchten, verwenden Sie:
@Html.Action("action", "controller", parameters)
Empfohlene Lösung: @ Html.Action
Meine persönliche Präferenz ist die Verwendung, @Html.Action
da jeder Controller seine eigenen Ansichten verwalten kann, anstatt auf Ansichten anderer Controller zu verweisen (was zu einem großen Spaghetti-ähnlichen Durcheinander führt).
Normalerweise übergeben Sie nur die erforderlichen Schlüsselwerte (wie jede andere Ansicht), z. B. für Ihr Beispiel:
@Html.Action("XXX", "ABC", new {id = model.xyzId })
Dadurch wird die ABC.XXX
Aktion ausgeführt und das Ergebnis an Ort und Stelle gerendert. Dadurch können die Ansichten und Controller separat in sich geschlossen bleiben (dh wiederverwendbar sein).
Update September 2014:
Ich bin gerade auf eine Situation gestoßen, in der ich @ Html.Action nicht verwenden konnte, aber einen Ansichtspfad basierend auf a action
und controller
Namen erstellen musste . Zu diesem Zweck habe ich diese einfache View
Erweiterungsmethode hinzugefügt , UrlHelper
damit Sie return sagen können PartialView(Url.View("actionName", "controllerName"), modelData)
:
public static class UrlHelperExtension
{
public static string View(this UrlHelper url, string action, string controller)
{
return string.Format("~/Views/{1}/{0}.cshtml", action, controller);
}
}
Das Steuerelement sucht in der folgenden Reihenfolge nach einer Ansicht:
Da Sie
xxx.cshtml
an diesen Speicherorten keine haben , wird der Fehler "Ansicht nicht gefunden" zurückgegeben.Lösung: Sie können den vollständigen Pfad Ihrer Ansicht verwenden:
Mögen
PartialView("~/views/ABC/XXX.cshtml", zyxmodel);
quelle
"best answer tick' and up-votes
nur Teilen zu verdienen ... Wie auch immer, danke für deinen Punkt. :)Einfach könnte man verwenden:
PartialView("../ABC/XXX")
quelle