दिलचस्प पोस्ट
इकाई फ़्रेमवर्क से SqlException – नया लेन-देन की अनुमति नहीं है क्योंकि सत्र में चल रहे अन्य थ्रेड्स हैं सी # का उपयोग कर एक एनटीपी सर्वर की क्वेरी कैसे करें? 1/3 = 0 का परिणाम क्यों है? क्या अजगर के ज़िप जैसी एक पीएचपी फ़ंक्शन है? आईओएस 9 – यह एप्लीकेशन एक पृष्ठभूमि थ्रेड से ऑटोलेआउट इंजन को संशोधित कर रहा है – जहां? वस्तु संपत्ति पर आधारित सरणी तत्व निकालें सी मिनेसेशल पाइपलाइन जोड़ना कैसे एक यूटीएफ -8 वेबसाइट को संभालने के लिए सबसे अच्छा PHP कॉन्फ़िगर करें I पंक्ति में JTable डुप्लिकेट मान कैसे ठीक से वर्तमान स्क्रिप्ट निर्देशिका का निर्धारण करने के लिए? Windows बैच फ़ाइल में क्लिपबोर्ड एक्सेस करें सरल डायलॉग के साथ पायथन में फाइल चुनना HTTP टेस्ट सर्वर जो प्राप्त / पोस्ट कॉल स्वीकार करता है इसकी विवरण विशेषता द्वारा एक एएनयूम मान ढूँढना आईओएस 7 टैबलेट दृश्य आईपैड पर सेटिंग ऐप में

एक वेबफ़ॉर्म के अंदर एक आंशिक दृश्य कैसे शामिल करें

मैं प्रोग्रामिंग कर रहा हूँ कुछ साइट दोनों ASP.NET MVC और WebForms का उपयोग कर रहा है।

मेरे पास आंशिक दृश्य है और मैं इसे एक वेबफ़ॉर्म के अंदर शामिल करना चाहता हूं। आंशिक दृश्य में कुछ कोड है जिसे सर्वर पर संसाधित करना है, इसलिए प्रतिक्रिया का उपयोग करना। Wright फ़ाइल काम नहीं करती। यह जावास्क्रिप्ट अक्षम के साथ काम करना चाहिए।

मैं यह कैसे कर सकता हूँ?

वेब के समाधान से एकत्रित समाधान "एक वेबफ़ॉर्म के अंदर एक आंशिक दृश्य कैसे शामिल करें"

मुझे यह देखने के लिए कि क्या मैं यह कैसे कर सकता हूं, MVC स्रोत पर एक नज़र आया। ऐसा लगता है कि नियंत्रक संदर्भ, दृश्य, दृश्य डेटा, रूटिंग डाटा और HTML रेंडर विधियों के बीच बहुत निकट युग्मन है।

असल में ऐसा करने के लिए आपको इन सभी अतिरिक्त तत्वों को बनाने की आवश्यकता है उनमें से कुछ अपेक्षाकृत सरल (जैसे दृश्य डेटा) हैं, लेकिन कुछ थोड़ा अधिक जटिल हैं – उदाहरण के तौर पर रूटिंग डेटा वर्तमान वेबफॉर्म पृष्ठ को ध्यान नहीं दिया जाएगा।

बड़ी समस्या HttpContext प्रतीत होती है – MVC पृष्ठ HttpContextBase पर निर्भर करते हैं (बजाय HttpContext की तरह WebForms करते हैं) और जब दोनों IServiceProvider को लागू करते हैं वे संबंधित नहीं हैं एमवीसी के डिजाइनर ने नए संदर्भ आधार का उपयोग करने के लिए विरासत वेबफॉर्म को बदलने के लिए एक जानबूझकर निर्णय किया, हालांकि उन्होंने एक आवरण प्रदान किया।

यह काम करता है और आपको आंशिक दृश्य को वेबफॉर्म में जोड़ने देता है:

public class WebFormController : Controller { } public static class WebFormMVCUtil { public static void RenderPartial( string partialName, object model ) { //get a wrapper for the legacy WebForm context var httpCtx = new HttpContextWrapper( System.Web.HttpContext.Current ); //create a mock route that points to the empty controller var rt = new RouteData(); rt.Values.Add( "controller", "WebFormController" ); //create a controller context for the route and http context var ctx = new ControllerContext( new RequestContext( httpCtx, rt ), new WebFormController() ); //find the partial view using the viewengine var view = ViewEngines.Engines.FindPartialView( ctx, partialName ).View; //create a view context and assign the model var vctx = new ViewContext( ctx, view, new ViewDataDictionary { Model = model }, new TempDataDictionary() ); //render the partial view view.Render( vctx, System.Web.HttpContext.Current.Response.Output ); } } 

फिर अपने वेबफॉर्म में आप यह कर सकते हैं:

 <% WebFormMVCUtil.RenderPartial( "ViewName", this.GetModel() ); %> 

यह कुछ समय लगा, लेकिन I'v को एक महान समाधान मिला। जैसा कीथ समाधान कई लोगों के लिए काम करता है, लेकिन कुछ स्थितियों में यह सबसे अच्छा नहीं है, क्योंकि कभी-कभी आप चाहते हैं कि आपका आवेदन नियंत्रक की प्रक्रिया के माध्यम से देखने के लिए जाए, और कीथ का समाधान सिर्फ एक दिए गए दृश्य के साथ प्रस्तुत करना चाहता है मॉडल मैं यहाँ एक नया समाधान पेश कर रहा हूं जो सामान्य प्रक्रिया को चलाएगा।

सामान्य कदम:

  1. एक उपयोगिता वर्ग बनाएँ
  2. डमी दृश्य के साथ एक डमी नियंत्रक बनाएं
  3. आपके 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(); } } 

DummyController के लिए निम्नांकित सामग्री के साथ PartialRender.cshtml (रेजर व्यू) नामक एक डमी व्यू बनाएं, ध्यान दें कि यह एचटीएमएल हेल्पर का उपयोग करते हुए एक अन्य रेंडर ऐक्शन का प्रदर्शन करेगा

 @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 }); %> 

यह समाधान महान है, एजेक्स कॉल का उपयोग नहीं करता है , जो नेस्टेड दृश्यों के लिए विलंबित रेंडर का कारण नहीं होगा, यह एक नया वेबआरिएंस्ट नहीं करता है, इसलिए यह आपको एक नया सत्र नहीं लाएगा , और यह पुनर्प्राप्त करने के लिए विधि को संसाधित करेगा आप चाहते हैं कि देखने के लिए ActionResult , यह किसी भी मॉडल को पारित किए बिना काम करता है

एक वेबफॉर्म के भीतर MVC रेंडर एक्शन का उपयोग करने के लिए धन्यवाद

सबसे स्पष्ट तरीका AJAX के माध्यम से होगा

ऐसा कुछ (jQuery का उपयोग करना)

 <div id="mvcpartial"></div> <script type="text/javascript"> $(document).load(function () { $.ajax( { type: "GET", url : "urltoyourmvcaction", success : function (msg) { $("#mvcpartial").html(msg); } }); }); </script> 

यह महान है, धन्यवाद!

मैं .NET 4 पर MVC 2 का उपयोग कर रहा हूं, जिसके लिए एक TextWriter की आवश्यकता होती है, ViewContext में हो जाती है, इसलिए आपको httpContextWrapper.Response.Output में नीचे दिखाया गया है।

  public static void RenderPartial(String partialName, Object model) { // get a wrapper for the legacy WebForm context var httpContextWrapper = new HttpContextWrapper(HttpContext.Current); // create a mock route that points to the empty controller var routeData = new RouteData(); routeData.Values.Add(_controller, _webFormController); // create a controller context for the route and http context var controllerContext = new ControllerContext(new RequestContext(httpContextWrapper, routeData), new WebFormController()); // find the partial view using the viewengine var view = ViewEngines.Engines.FindPartialView(controllerContext, partialName).View as WebFormView; // create a view context and assign the model var viewContext = new ViewContext(controllerContext, view, new ViewDataDictionary { Model = model }, new TempDataDictionary(), httpContextWrapper.Response.Output); // render the partial view view.Render(viewContext, httpContextWrapper.Response.Output); } 

यह मेरे लिए एक समान दृष्टिकोण है जो काम कर रहा है रणनीति को आंशिक दृश्य को एक स्ट्रिंग में प्रस्तुत करना है, फिर वेबफ़ॉर्म पृष्ठ में आउटपुट।

  public class TemplateHelper { /// <summary> /// Render a Partial View (MVC User Control, .ascx) to a string using the given ViewData. /// http://www.joeyb.org/blog/2010/01/23/aspnet-mvc-2-render-template-to-string /// </summary> /// <param name="controlName"></param> /// <param name="viewData"></param> /// <returns></returns> public static string RenderPartialToString(string controlName, object viewData) { ViewDataDictionary vd = new ViewDataDictionary(viewData); ViewPage vp = new ViewPage { ViewData = vd}; Control control = vp.LoadControl(controlName); vp.Controls.Add(control); StringBuilder sb = new StringBuilder(); using (StringWriter sw = new StringWriter(sb)) { using (HtmlTextWriter tw = new HtmlTextWriter(sw)) { vp.RenderControl(tw); } } return sb.ToString(); } } 

पृष्ठ कोड में, आप ऐसा कर सकते हैं

 public partial class TestPartial : System.Web.UI.Page { public string NavigationBarContent { get; set; } protected void Page_Load(object sender, EventArgs e) { NavigationVM oVM = new NavigationVM(); NavigationBarContent = TemplateHelper.RenderPartialToString("~/Views/Shared/NavigationBar.ascx", oVM); } } 

और पृष्ठ में आपको गाया सामग्री तक पहुंच होगी

 <%= NavigationBarContent %> 

उम्मीद है की वो मदद करदे!

यह समाधान एक अलग दृष्टिकोण लेता है यह एक System.Web.UI.UserControl परिभाषित करता है जो किसी भी वेब प्रपत्र पर हो सकता है और किसी भी URL से सामग्री प्रदर्शित करने के लिए कॉन्फ़िगर किया जा सकता है … जिसमें एक MVC आंशिक दृश्य शामिल है। यह दृष्टिकोण उस पैरामीटर (यदि कोई है) में HTML के लिए एक AJAX कॉल के समान है, तो URL क्वेरी स्ट्रिंग के माध्यम से दिया जाता है

सबसे पहले, 2 फ़ाइलों में एक उपयोगकर्ता नियंत्रण परिभाषित करें:

/controls/partialViewControl.ascx फ़ाइल

 <%@ Control Language="C#" AutoEventWireup="true" CodeFile="PartialViewControl.ascx.cs" Inherits="PartialViewControl" %> 

/controls/PartialViewControl.ascx.cs:

 public partial class PartialViewControl : System.Web.UI.UserControl { [Browsable(true), Category("Configutation"), Description("Specifies an absolute or relative path to the content to display.")] public string contentUrl { get; set; } protected override void Render(HtmlTextWriter writer) { string requestPath = (contentUrl.StartsWith("http") ? contentUrl : "http://" + Request.Url.DnsSafeHost + Page.ResolveUrl(contentUrl)); WebRequest request = WebRequest.Create(requestPath); WebResponse response = request.GetResponse(); Stream responseStream = response.GetResponseStream(); var responseStreamReader = new StreamReader(responseStream); var buffer = new char[32768]; int read; while ((read = responseStreamReader.Read(buffer, 0, buffer.Length)) > 0) { writer.Write(buffer, 0, read); } } } 

फिर अपने वेब प्रपत्र पृष्ठ पर उपयोगकर्ता नियंत्रण जोड़ें:

 <%@ Page Language="C#" %> <%@ Register Src="~/controls/PartialViewControl.ascx" TagPrefix="mcs" TagName="PartialViewControl" %> <h1>My MVC Partial View</h1> <p>Below is the content from by MVC partial view (or any other URL).</p> <mcs:PartialViewControl runat="server" contentUrl="/MyMVCView/" />