Это заняло некоторое время, но я нашел отличное решение. Решение Кейта работает для многих людей, но в определенных ситуациях оно не самое лучшее, потому что иногда вы хотите, чтобы ваше приложение прошло через процесс контроллера для рендеринга представления, а решение Кейта просто отображает представление с заданной моделью. Я представляю здесь новое решение, которое будет запускать обычный процесс.
Общие шаги:
- Создайте служебный класс
- Создайте фиктивный контроллер с фиктивным представлением
- В вашем
aspx
или master page
вызовите служебный метод для частичного рендеринга с передачей Контроллера, представления и, если вам нужно, модели для рендеринга (как объекта),
Давайте внимательно проверим это на этом примере
1) Создайте класс с именем MVCUtility
и создайте следующие методы:
//Render a partial view, like Keith's solution
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);
}
//Find the view, if not throw an exception
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));
}
//Here the method that will be called from MasterPage or Aspx
public static void RenderAction(string controllerName, string actionName, object routeValues)
{
RenderPartial("PartialRender", new RenderActionViewModel() { ControllerName = controllerName, ActionName = actionName, RouteValues = routeValues });
}
Создайте класс для передачи параметров, я назову здесь RendeActionViewModel (вы можете создать в том же файле класса MvcUtility)
public class RenderActionViewModel
{
public string ControllerName { get; set; }
public string ActionName { get; set; }
public object RouteValues { get; set; }
}
2) Теперь создайте контроллер с именем DummyController
//Here the Dummy controller with Dummy view
public class DummyController : Controller
{
public ActionResult PartialRender()
{
return PartialView();
}
}
Создайте фиктивное представление с именем PartialRender.cshtml
(вид бритвы) для DummyController
со следующим содержимым, обратите внимание, что оно будет выполнять другое действие визуализации с помощью помощника Html.
@model Portal.MVC.MvcUtility.RenderActionViewModel
@{Html.RenderAction(Model.ActionName, Model.ControllerName, Model.RouteValues);}
3) Теперь просто поместите это в свой MasterPage
или aspx
файл, чтобы выполнить частичный рендеринг нужного вам вида. Обратите внимание, что это отличный ответ, когда у вас есть несколько представлений бритвы, которые вы хотите смешать со своими MasterPage
или aspx
страницами. (предположим, что у нас есть PartialView под названием Login for the Controller Home).
<% MyApplication.MvcUtility.RenderAction("Home", "Login", new { }); %>
или если у вас есть модель для перехода в действие
<% MyApplication.MvcUtility.RenderAction("Home", "Login", new { Name="Daniel", Age = 30 }); %>
Это отличное решение, не использует вызов ajax, который не вызывает отложенного рендеринга для вложенных представлений, он не создает новый WebRequest < / strong>, поэтому он не приведет к новому сеансу и обработает метод получения ActionResult для нужного вам представления, он работает без передачи любая модель
Благодаря использованию MVC RenderAction в веб-форме
person
Daniel
schedule
21.07.2014