Es hat eine Weile gedauert, aber ich habe eine großartige Lösung gefunden. Keiths Lösung funktioniert für viele Menschen, aber in bestimmten Situationen ist es nicht die beste, weil manchmal mögen Sie Ihre Anwendung durch den Prozess des Controllers geht für das Rendern der Ansicht, und Keith-Lösung macht nur die Ansicht mit einem bestimmten Modell I‘ Ich präsentiere hier eine neue Lösung, die den normalen Prozess ausführt.
Allgemeine Schritte:
- Erstellen Sie eine Utility-Klasse
- Erstellen Sie einen Dummy-Controller mit einer Dummy-Ansicht
- Rufen Sie in Ihrem
aspx
oder master page
die Dienstprogrammmethode auf, um das teilweise Übergeben des Controllers zu rendern, die Ansicht anzuzeigen und bei Bedarf das zu rendernde Modell (als Objekt).
Lassen Sie es uns in diesem Beispiel genau überprüfen
1) Erstellen Sie eine aufgerufene Klasse MVCUtility
und erstellen Sie die folgenden Methoden:
private static void RenderPartial(string partialViewName, object model)
{
HttpContextBase httpContextBase = new HttpContextWrapper(HttpContext.Current);
RouteData routeData = new RouteData();
routeData.Values.Add("controller", "Dummy");
ControllerContext controllerContext = new ControllerContext(new RequestContext(httpContextBase, routeData), new DummyController());
IView view = FindPartialView(controllerContext, partialViewName);
ViewContext viewContext = new ViewContext(controllerContext, view, new ViewDataDictionary { Model = model }, new TempDataDictionary(), httpContextBase.Response.Output);
view.Render(viewContext, httpContextBase.Response.Output);
}
private static IView FindPartialView(ControllerContext controllerContext, string partialViewName)
{
ViewEngineResult result = ViewEngines.Engines.FindPartialView(controllerContext, partialViewName);
if (result.View != null)
{
return result.View;
}
StringBuilder locationsText = new StringBuilder();
foreach (string location in result.SearchedLocations)
{
locationsText.AppendLine();
locationsText.Append(location);
}
throw new InvalidOperationException(String.Format("Partial view {0} not found. Locations Searched: {1}", partialViewName, locationsText));
}
public static void RenderAction(string controllerName, string actionName, object routeValues)
{
RenderPartial("PartialRender", new RenderActionViewModel() { ControllerName = controllerName, ActionName = actionName, RouteValues = routeValues });
}
Erstellen Sie eine Klasse zum Übergeben der Parameter. Ich werde hier RendeActionViewModel aufrufen (Sie können in derselben Datei der MvcUtility-Klasse erstellen).
public class RenderActionViewModel
{
public string ControllerName { get; set; }
public string ActionName { get; set; }
public object RouteValues { get; set; }
}
2) Erstellen Sie nun einen Controller mit dem Namen DummyController
public class DummyController : Controller
{
public ActionResult PartialRender()
{
return PartialView();
}
}
Erstellen Sie eine Dummy-Ansicht mit dem Namen PartialRender.cshtml
(Rasiereransicht) für die DummyController
mit dem folgenden Inhalt. Beachten Sie, dass mit dem HTML-Helfer eine weitere Renderaktion ausgeführt wird.
@model Portal.MVC.MvcUtility.RenderActionViewModel
@{Html.RenderAction(Model.ActionName, Model.ControllerName, Model.RouteValues);}
3) Fügen Sie dies nun einfach in Ihre MasterPage
oder aspx
-Datei ein, um eine gewünschte Ansicht teilweise zu rendern. Beachten Sie, dass dies eine gute Antwort ist, wenn Sie mehrere Rasiereransichten haben, die Sie mit Ihren MasterPage
oder Ihren aspx
Seiten mischen möchten . (Angenommen, wir haben eine PartialView namens Login für die Controller-Startseite).
<% MyApplication.MvcUtility.RenderAction("Home", "Login", new { }); %>
oder wenn Sie ein Modell für die Übergabe an die Aktion haben
<% MyApplication.MvcUtility.RenderAction("Home", "Login", new { Name="Daniel", Age = 30 }); %>
Diese Lösung ist großartig, verwendet keinen Ajax-Aufruf , der kein verzögertes Rendern für die verschachtelten Ansichten verursacht, keine neue WebRequest erstellt, sodass keine neue Sitzung angezeigt wird , und die Methode zum Abrufen verarbeitet Das ActionResult für die gewünschte Ansicht funktioniert ohne Übergabe eines Modells
Dank der Verwendung von MVC RenderAction in einem Webformular