Mất một lúc, nhưng tôi đã tìm thấy một giải pháp tuyệt vời. Vì giải pháp Keith làm việc cho rất nhiều người, nhưng trong một số trường hợp, 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 quá trình đ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 Tôi trình bày ở đây một giải pháp mới sẽ chạy quy trình bình thường.
bước chung:
- Tạo một lớp Utility
- Tạo một điều khiển Dummy với một cái nhìn giả
- Trong
aspx
hoặc master page
của bạn, gọi phương thức tiện ích để làm cho một phần đi qua các điều khiển, xem và nếu bạn cần, mô hình để hiển thị (dưới dạng đối tượng),
Hãy kiểm tra chặt chẽ trong ví dụ này
1) tạo ra một lớp gọi là MVCUtility
và tạo ra các phương pháp sau đây:
//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 });
}
Tạo một lớp để thông qua các thông số, tôi sẽ gọi đây RendeActionViewModel (bạn có thể tạo ra trong cùng một tập tin 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 điều khiển tên DummyController
//Here the Dummy controller with Dummy view
public class DummyController : Controller
{
public ActionResult PartialRender()
{
return PartialView();
}
}
Tạo một cái nhìn Dummy gọi PartialRender.cshtml
(xem dao cạo) cho DummyController
với các nội dung sau đây, lưu ý rằng nó sẽ thực hiện một Render hành động bằng cách sử dụng helper Html
@model Portal.MVC.MvcUtility.RenderActionViewModel
@{Html.RenderAction(Model.ActionName, Model.ControllerName, Model.RouteValues);}
3) Bây giờ chỉ cần đặt này trong MasterPage
hoặc aspx
của bạn tệp, để 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 của dao cạo mà bạn muốn trộn với các trang MasterPage
hoặc aspx
của mình.(Suposing chúng tôi có một PartialView gọi nhập cho Controller Trang chủ
<% MyApplication.MvcUtility.RenderAction("Home", "Login", new { }); %>
hoặc nếu bạn có một mô hình để thông qua vào Action
<% MyApplication.MvcUtility.RenderAction("Home", "Login", new { Name="Daniel", Age = 30 }); %>
Giải pháp này là rất tốt, không sử dụng ajax gọi , mà sẽ không gây ra một trì hoãn làm cho quan điểm lồng nhau, nó doens't làm cho một WebRequest mới nên sẽ không mang lại cho bạn một phiên mới, và nó sẽ xử lý phương pháp để lấy các ActionResult cho quan điểm mà bạn muốn, nó hoạt động mà không đi bất kỳ mô hình
NhờUsing MVC RenderAction within a Webform
Tôi có cùng một vấn đề - Html.RenderPartial không thể làm việc trên WebForms, nhưng vẫn còn có một cách để làm điều này. – Keith