Phải mất một lúc, nhưng tôi đã tìm thấy một giải pháp tuyệt vời. Giải pháp của Keith phù hợp với nhiều người, nhưng trong một số trường hợp nhất định, nó không phải là tốt nhất, bởi vì đôi khi bạn muốn ứng dụng của mình trải qua quy trình của bộ điều khiển để hiển thị chế độ xem và giải pháp của Keith chỉ hiển thị chế độ xem với một mô hình nhất định I ' m trình bày ở đây một giải pháp mới sẽ chạy quá trình bình thường.
Các bước chung:
- Tạo một lớp Tiện ích
- Tạo Bộ điều khiển giả với chế độ xem giả
- Trong
aspx
hoặc master page
, hãy gọi phương thức tiện ích để kết xuất một phần chuyển Bộ điều khiển, dạng xem và nếu bạn cần, mô hình sẽ kết xuất (dưới dạng một đối tượng),
Hãy kiểm tra kỹ nó trong ví dụ này
1) Tạo một Lớp được gọi MVCUtility
và tạo các phương thức sau:
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 });
}
Tạo một lớp để truyền các tham số, tôi sẽ gọi ở đây là RendeActionViewModel (bạn có thể tạo trong cùng một tệp của Lớp MvcUtility)
public class RenderActionViewModel
{
public string ControllerName { get; set; }
public string ActionName { get; set; }
public object RouteValues { get; set; }
}
2) Bây giờ tạo một Bộ điều khiển có tên DummyController
public class DummyController : Controller
{
public ActionResult PartialRender()
{
return PartialView();
}
}
Tạo một dạng xem Dummy được gọi là PartialRender.cshtml
(dạng xem dao cạo) cho DummyController
nội dung sau, lưu ý rằng nó sẽ thực hiện một Hành động kết xuất khác bằng cách sử dụng trình trợ giúp Html.
@model Portal.MVC.MvcUtility.RenderActionViewModel
@{Html.RenderAction(Model.ActionName, Model.ControllerName, Model.RouteValues);}
3) Bây giờ chỉ cần đặt nó vào MasterPage
hoặc aspx
tệp của bạn , để hiển thị một phần chế độ xem mà bạn muốn. Lưu ý rằng đây là một câu trả lời tuyệt vời khi bạn có nhiều chế độ xem dao cạo mà bạn muốn kết hợp với MasterPage
hoặc aspx
các trang của mình. (giả sử chúng ta có Chế độ xem từng phần được gọi là Đăng nhập cho Trang chủ bộ điều khiển).
<% MyApplication.MvcUtility.RenderAction("Home", "Login", new { }); %>
hoặc nếu bạn có một mô hình để chuyển vào Hành động
<% MyApplication.MvcUtility.RenderAction("Home", "Login", new { Name="Daniel", Age = 30 }); %>
Giải pháp này rất tuyệt vời, không sử dụng lệnh gọi ajax , điều này sẽ không gây ra hiện tượng chậm trễ cho các khung nhìn lồng nhau, nó không tạo một WebRequest mới vì vậy nó sẽ không mang lại cho bạn một phiên mới và nó sẽ xử lý phương thức để truy xuất ActionResult cho chế độ xem bạn muốn, nó hoạt động mà không cần chuyển bất kỳ mô hình nào
Nhờ sử dụng MVC RenderAction trong một biểu mẫu web