Trochę to trwało, ale znalazłem świetne rozwiązanie. Rozwiązanie Keitha działa dla wielu ludzi, ale w pewnych sytuacjach nie jest najlepsze, ponieważ czasami chcesz, aby aplikacja przeszła przez proces kontrolera w celu renderowania widoku, a rozwiązanie Keitha po prostu renderuje widok za pomocą danego modelu I ' Przedstawiam tutaj nowe rozwiązanie, które będzie działać normalnie.
Ogólne kroki:
- Utwórz klasę Utility
- Utwórz wirtualny kontroler z fałszywym widokiem
- W swoim
aspx
lub master page
wywołaj metodę narzędziową, aby renderować częściowe przekazanie kontrolera, wyświetlić i, jeśli potrzebujesz, model do renderowania (jako obiekt),
Sprawdźmy to dokładnie w tym przykładzie
1) Utwórz klasę o nazwie MVCUtility
i utwórz następujące metody:
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 });
}
Utwórz klasę do przekazywania parametrów, zadzwonię tutaj RendeActionViewModel (możesz utworzyć w tym samym pliku klasy MvcUtility)
public class RenderActionViewModel
{
public string ControllerName { get; set; }
public string ActionName { get; set; }
public object RouteValues { get; set; }
}
2) Teraz utwórz kontroler o nazwie DummyController
public class DummyController : Controller
{
public ActionResult PartialRender()
{
return PartialView();
}
}
Utwórz widok Dummy o nazwie PartialRender.cshtml
(widok brzytwy) DummyController
z następującą zawartością, zwróć uwagę, że wykona on inną akcję renderowania za pomocą pomocnika HTML.
@model Portal.MVC.MvcUtility.RenderActionViewModel
@{Html.RenderAction(Model.ActionName, Model.ControllerName, Model.RouteValues);}
3) Teraz po prostu umieść to w swoim pliku MasterPage
lub aspx
, aby częściowo wyrenderować żądany widok. Pamiętaj, że jest to świetna odpowiedź, gdy masz wiele widoków maszynki do golenia, które chcesz połączyć ze swoimi MasterPage
lub aspx
stronami. (zakładając, że mamy widok PartialView o nazwie Logowanie do strony głównej kontrolera).
<% MyApplication.MvcUtility.RenderAction("Home", "Login", new { }); %>
lub jeśli masz model do przejścia do Akcji
<% MyApplication.MvcUtility.RenderAction("Home", "Login", new { Name="Daniel", Age = 30 }); %>
To rozwiązanie jest świetne, nie używa wywołania ajax , które nie spowoduje opóźnionego renderowania dla zagnieżdżonych widoków, nie tworzy nowego żądania WebRequest, więc nie przyniesie ci nowej sesji i przetworzy metodę pobierania ActionResult dla żądanego widoku, działa bez przekazywania żadnego modelu
Dzięki zastosowaniu MVC RenderAction w formularzu internetowym