Це зайняло деякий час, але я знайшов чудове рішення. Рішення Кіта працює для багатьох людей, але в певних ситуаціях це не найкраще, тому що іноді ви хочете, щоб ваша програма проходила процес контролера для рендерінгу подання, а рішення Кіта просто рендерить вигляд із заданою моделлю I ' м, представляючи тут нове рішення, яке буде запускати звичайний процес.
Загальні кроки:
- Створіть клас Utility
- Створіть фіктивний контролер із фіктивним видом
- У вашому
aspx
або master page
, зателефонуйте утилітному методу для часткової передачі контролера, подання та, якщо потрібно, моделі для візуалізації (як об'єкта),
Давайте уважно перевіримо це в цьому прикладі
1) Створіть клас із викликом MVCUtility
та створіть такі методи:
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 });
}
Створіть клас для передачі параметрів, я покличу сюди RendeActionViewModel (ви можете створити в тому ж файлі класу MvcUtility)
public class RenderActionViewModel
{
public string ControllerName { get; set; }
public string ActionName { get; set; }
public object RouteValues { get; set; }
}
2) Тепер створіть контролер з іменем DummyController
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, тому не приносить вам нового сеансу , а також обробляє метод для отримання ActionResult для подання, яке ви хочете, воно працює, не передаючи жодної моделі
Завдяки використанню MVC RenderAction у веб-формі