इसमें कुछ समय लगा, लेकिन मुझे एक बढ़िया समाधान मिल गया है। कीथ का समाधान बहुत से लोगों के लिए काम करता है, लेकिन कुछ स्थितियों में यह सबसे अच्छा नहीं है, क्योंकि कभी-कभी आप चाहते हैं कि आपका एप्लिकेशन दृश्य प्रदान करने के लिए नियंत्रक की प्रक्रिया से गुजरे , और कीथ का समाधान केवल दिए गए मॉडल I के साथ दृश्य का प्रतिपादन करता है । मी यहां एक नया समाधान प्रस्तुत कर रहा हूं जो सामान्य प्रक्रिया को चलाएगा।
सामान्य चरण:
- एक उपयोगिता वर्ग बनाएँ
- एक डमी दृश्य के साथ एक डमी नियंत्रक बनाएँ
- अपने
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 Class की एक ही फाइल में बना सकते हैं)
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
साथ एक डमी दृश्य (रेजर दृश्य) बनाएं , ध्यान दें कि यह एचटीएमएल हेल्पर का उपयोग करके एक और रेंडर एक्शन करेगा।
@model Portal.MVC.MvcUtility.RenderActionViewModel
@{Html.RenderAction(Model.ActionName, Model.ControllerName, Model.RouteValues);}
3) अब बस इसे अपनी MasterPage
या aspx
फ़ाइल में डालें , जो आप चाहते हैं कि एक दृश्य को आंशिक रूप से प्रस्तुत करें। ध्यान दें कि यह एक शानदार उत्तर है जब आपके पास कई रेजर के विचार हैं जिन्हें आप अपने MasterPage
या aspx
पृष्ठों के साथ मिलाना चाहते हैं । (मान लें कि हमारे पास एक आंशिक दृश्य है, जिसे लॉगिन फॉर कंट्रोलर होम कहा जाता है)।
<% MyApplication.MvcUtility.RenderAction("Home", "Login", new { }); %>
या यदि आपके पास एक्शन में पास होने के लिए कोई मॉडल है
<% MyApplication.MvcUtility.RenderAction("Home", "Login", new { Name="Daniel", Age = 30 }); %>
यह समाधान महान है, ajax कॉल का उपयोग नहीं करता है , जो नेस्टेड विचारों के लिए विलंबित रेंडर का कारण नहीं होगा , यह एक नया WebRequest नहीं बनाता है इसलिए यह आपको एक नया सत्र नहीं लाएगा , और यह पुनर्प्राप्त करने के लिए विधि को संसाधित करेगा ActionResult आप चाहते हैं देखने के लिए, यह किसी भी मॉडल को पारित किए बिना काम करता है
एक वेबफॉर्म के भीतर एमवीसी रेंडरएशन का उपयोग करने के लिए धन्यवाद