2008-11-13 10 views
27

मैंने अपनी एमवीसी वेबसाइट के लिए jquery के माध्यम से html में खींचने के लिए एक सरल तंत्र विकसित किया है जो तब निर्दिष्ट div को पॉप्युलेट करता है। सब ठीक है और यह अच्छा लग रहा है।
मेरी समस्या यह है कि अब मैं अपने नियंत्रक के अंदर एचटीएमएल मार्कअप बना रहा हूं (जो VB.net btw में करना बहुत आसान है) मैं चिंताओं के पृथक्करण को मिश्रित नहीं करना चाहता हूं।नियंत्रक के अंदर से आंशिक दृश्य का HTML प्राप्त करना

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

+1

क्या आप अपने नियंत्रक में HTML मार्कअप बनाकर चिंताओं का पृथक्करण नहीं कर रहे हैं? यदि आपको एएक्सएक्स नियंत्रण का उपयोग करके बार-बार कुछ करने की ज़रूरत है? –

+0

क्या एचटीएमएल उत्पन्न करने के बारे में विचार चिंतित नहीं होना चाहिए? आपके नियंत्रक में आपका मार्कअप क्यों है? –

+0

http://2leggedspider.wordpress.com/2009/11/05/serializing-a-partialview-as-json-in-asp-net-mvc/ मुझे बस एक ही कार्यक्षमता की आवश्यकता है। मेरे जेसन ऑब्जेक्ट में आंशिक रूप से प्रस्तुत किया गया। यह लिंक मेरे लिए उपयोगी था – Bcelik

उत्तर

2

आपके पास कई विकल्प हैं।

दृश्य के लिए अपने नियंत्रक में एक एमवीसी व्यू उपयोगकर्ता नियंत्रण और क्रिया हैंडलर बनाएं। रेंडर करने के लिए दृश्य का उपयोग

<% Html.RenderPartial("MyControl") %> 

इस मामले में अपनी कार्रवाई हैंडलर दृश्य

public ActionResult MyControl() 
{ 
    // get modelData 

    render View (modelData); 
} 

आपका दूसरा विकल्प माता पिता पेज से मॉडल डेटा पास करने के लिए है करने के लिए मॉडल डेटा पास करने की आवश्यकता होगी। इस मामले में आप एक एक्शन हैंडलर की जरूरत नहीं है और मॉडल प्रकार माता पिता के रूप में एक ही है:

<% Html.RenderPartial("MyControl", ViewData.Model) %> 

यदि आपका उपयोगकर्ता नियंत्रण यह स्वयं के डेटा प्रकार आप भी पेज

में भीतर का निर्माण कर सकते है है MyControl.ascx.cs:

public class MyControlViewData 
{ 
    public string Name { get; set; } 
    public string Email { get; set; } 
} 

public partial class MyControl : System.Web.Mvc.ViewUserControl <MyControlViewData> 
{ 
} 

और अपने पेज में आप अपने नियंत्रण के डेटा मॉडल को प्रारंभ कर सकते हैं:

<% Html.RenderPartial("MyControl", new MyControlViewData() 
    { 
     Name= ViewData.Model.FirstName, 
     Email = ViewData.Model.Email, 
    }); 
%> 
+5

यह एचटीएमएल पर आपकी प्रोग्रामेटिक पहुंच नहीं देता है जो दृश्य/आंशिक अधिकार से उत्पन्न होता है? मुझे समझ में नहीं आता कि यह सवाल कैसे जवाब देता है ... हालांकि मैंने जवाब से सीखा है, इसलिए मैं इसे उच्च गुणवत्ता की प्रतिक्रिया के रूप में सराहना करता हूं। –

+3

यह प्रतिक्रिया पूछे गए प्रश्न का उत्तर नहीं देती है। मैं नियंत्रक के अंदर से आंशिक दृश्य का HTML कैसे प्राप्त करूं? –

+0

क्या आप इसे ब्राउज़र पर वापस भेजने से पहले HTML को कैप्चर/संशोधित करना चाहते हैं? –

0

रेल में इसे आंशिक दृश्य प्रस्तुत करने के लिए कहा जाता है, और आप इसे render :partial => 'yourfilename' के साथ करते हैं। मेरा मानना ​​है कि एएसपी.नेट एमवीसी की एक समान RenderPartial विधि है, लेकिन मुझे ऐसी चीज़ की पुष्टि या इनकार करने के लिए एमवीसी के आधिकारिक दस्तावेज़ नहीं मिल रहे हैं।

+0

मैं इस मुद्दे को गुगल रहा हूं; ऐसा लगता है कि एमवीसी बीटा के बाद से कुछ विधियां तोड़ दी गई हैं जिन्हें हटा दिया गया है। अभी भी एक उत्तर के लिए शिकार –

7

आप इस तरह अपने कार्रवाई बनाने होगा:

 public PartialViewResult LoginForm() 
     { 
      var model = // get model data from somewhere 
      return PartialView(model); 
     }

और कार्रवाई अपने jQuery जवाबी कार्रवाई के लिए प्रदान की गई आंशिक दृश्य लौट आते हैं।

$('#targetdiv').load('/MyController/LoginForm',function(){alert('complete!');});
5

आप अपने divs पॉप्युलेट (और नए HTML तत्वों अगर जरूरत बनाने) के लिए jQuery का उपयोग करना चाहिए, और ActionResult के लिए Json क्रमबद्धता:

आपका jQuery कुछ इस तरह दिखाई सकता है।

अन्य तरीका कुछ नियंत्रक/क्रिया को कॉल करने के लिए jquery का उपयोग करना है, लेकिन इसके बजाय जेसन सामग्री को प्रतिपादित करने के लिए नियमित दृश्य (एएसपीएक्स या एसीएक्स, वेबफॉर्म व्यू इंजन) का उपयोग करें, और jquery के साथ बस कुछ div को उस HTML को इंजेक्ट करें। यह asp.net AJAX से UpdatePanels का आधा तरीका है ...

मैं शायद जेसन के साथ पहली विधि के साथ जाऊंगा, जहां आपके पास थोड़ा और काम है, लेकिन यह बहुत अधिक "अनुकूलित" है, क्योंकि आप ' तार पर पूरे एचटीएमएल को स्थानांतरित करें, केवल क्रमबद्ध वस्तुओं हैं। यह तरीका है कि "बड़े लोग" (जीमेल, जी डॉक्स, हॉटमेल, ..) ऐसा करते हैं - जेएस कोड के बहुत सारे जो यूआई के साथ छेड़छाड़ करते हैं।

आप ajax की जरूरत नहीं है, तो आप मूल रूप से आंशिक दृश्य बुलाने की दो तरीके हैं:

  • html.renderpartial ("ascx का नाम है")
  • html.RenderAction (x => x .ctionName) से Microsoft.web.mvc (mvc futures)
+0

आपके द्वारा सुझाए गए पहले तरीके में, क्या आप आंशिक विचारों का उपयोग करने का जिक्र कर रहे हैं? –

+0

नहीं, सामग्री को प्रतिपादित करने के लिए कोई दृश्य नहीं है, कम से कम सर्वर पक्ष पर नहीं, बस जेसन ऑब्जेक्ट जो jQuery पर वापस आ गया है, जिसे तब प्रतिपादन करने की आवश्यकता है: गतिशील रूप से डिव, स्पैन, टेबल्स, ... बनाएं और उन्हें डेटा से पॉप्युलेट करें जेसन अजाक्स अनुरोध। दूसरी विधि सर्वर पर संपूर्ण HTML प्रस्तुत करती है और इसे क्लाइंट पर लौटाती है। –

8

मैंने एक मोटा ढांचा तैयार किया है जो आपको एमवीसी बीटा में नियंत्रक विधि से स्ट्रिंग में दृश्य प्रस्तुत करने की अनुमति देता है। इससे अब इस सीमा को हल करने में मदद मिलनी चाहिए।

इसके अतिरिक्त, मैंने एमवीसी बीटा के लिए एक रेल-जैसे आरजेएस जावास्क्रिप्ट जनरेटिंग फ्रेमवर्क भी रखा।

इसे http://www.brightmix.com/blog/how-to-renderpartial-to-string-in-asp-net-mvc पर देखें और मुझे बताएं कि आप क्या सोचते हैं।

29

यह एक समाधान है जो एएसपी.NET एमवीसी 1.0 के साथ काम कर रहा है (बीटा 3 के साथ काम करने का दावा करने वाले कई लोग 1.0 के साथ काम नहीं करते हैं), 'HTTP हेडर भेजे जाने के बाद सर्वर सामग्री प्रकार सेट नहीं कर सकता है 'समस्या और एक नियंत्रक के भीतर (न केवल एक दृश्य) से कहा जा सकता है:

/// <summary> 
/// Render a view into a string. It's a hack, it may fail badly. 
/// </summary> 
/// <param name="name">Name of the view, that is, its path.</param> 
/// <param name="data">Data to pass to the view, a model or something like that.</param> 
/// <returns>A string with the (HTML of) view.</returns> 
public static string RenderPartialToString(string controlName, object viewData) { 
    ViewPage viewPage = new ViewPage() { ViewContext = new ViewContext() }; 
    viewPage.Url = GetBogusUrlHelper(); 

    viewPage.ViewData = new ViewDataDictionary(viewData); 
    viewPage.Controls.Add(viewPage.LoadControl(controlName)); 

    StringBuilder sb = new StringBuilder(); 
    using (StringWriter sw = new StringWriter(sb)) { 
     using (HtmlTextWriter tw = new HtmlTextWriter(sw)) { 
      viewPage.RenderControl(tw); 
     } 
    } 

    return sb.ToString(); 
} 

public static UrlHelper GetBogusUrlHelper() { 
    var httpContext = HttpContext.Current; 

    if (httpContext == null) { 
    var request = new HttpRequest("/", Config.Url.ToString(), ""); 
    var response = new HttpResponse(new StringWriter()); 
    httpContext = new HttpContext(request, response); 
    } 

    var httpContextBase = new HttpContextWrapper(httpContext); 
    var routeData = new RouteData(); 
    var requestContext = new RequestContext(httpContextBase, routeData); 

    return new UrlHelper(requestContext); 
} 

यह एक स्थिर विधि आप कहीं ड्रॉप कर सकते हैं कि आप यह सुविधाजनक लगता है। आप इसे इस तरह से कॉल कर सकते हैं:

string view = RenderPartialToString("~/Views/Controller/AView.ascx", someModelObject); 
+0

यह अभी भी कुछ है जो किसी भी प्रमुख एमवीसी परियोजना पर अक्सर आवश्यक होता है। तो विधि –

+0

के लिए धन्यवाद यह मेरे लिए काम नहीं कर रहा है क्योंकि मेरे आंशिक लोग UrUHerper क्लास का उपयोग ViewUserControl की यूआरएल प्रॉपर्टी में भरे हुए हैं, और यह विधि उस संपत्ति को शून्य छोड़ने लगती है, जिसके परिणामस्वरूप मेरे सहायक कॉल पर अपवाद । कोई सलाह? –

+0

माइकल, शायद http://stackoverflow.com/questions/2031995/call-urlhelper-in-models-in-asp-net-mvc में कुछ जानकारी आपकी मदद कर सकती है। मुझे याद नहीं है कि यूआरएल के साथ परेशानी हो रही है और मुझे लगता है कि मैं इसका इस्तेमाल कर रहा था। – Pablo

3

मैंने एक ऐप के लिए ऐसा कुछ किया है जिस पर मैं काम कर रहा हूं।

<div class="onload">/controller/action</div> 

jQuery दिखता है:

<% Html.RenderAction("Action", "Controller"); %> 

तब मेरे वास्तविक प्रदर्शन HTML में मैं एक DIV जो jQuery से भर जाता है है: मैं प्रदान की गई सामग्री वापस आंशिक दृश्य उनके बाकी पथ का उपयोग कर या का उपयोग करते हुए कहा जा सकता है है इस तरह:

<script type="text/javascript"> 
    $.ajaxSetup({ cache: false }); 

    $(document).ready(function() { 
     $('div.onload').each(function() { 
      var source = $(this).html(); 
      if (source != "") { 
       $(this).load(source); 
      } 
     }); 
    }); 
</script> 

यह सब DIV कि "ऑनलोड" वर्ग से मेल खाते हैं और उनकी सामग्री से बाकी पथ पढ़ता के लिए स्कैन करता है। यह फिर उस आरईएसटी पथ पर एक jQuery.load करता है और परिणाम के साथ डीआईवी populates।

क्षमा करें मुझे मेरी सवारी घर पकड़ना होगा। अगर आप मुझे और विस्तार करना चाहते हैं तो मुझे बताएं।

+0

प्यार करता है। बस कमाल – ekkis

0

इसे इस तरह अपने cotroller कुछ में तो बहुत ही सरल तुम सिर्फ एक जोरदार आंशिक दृश्य (या उपयोगकर्ता नियंत्रण) टाइप किया बनाने के लिए है:

public PartialViewResult yourpartialviewresult() 
{ 
    var yourModel 
    return PartialView("yourPartialView", yourModel); 
} 

तो आप अनुरोध whener आप चाहते हैं प्रदर्शन करने के लिए उपयोग कर सकते हैं JQuery :

$.ajax({ 
    type: 'GET', 
    url: '/home/yourpartialviewresult', 
    dataType: 'html', //be sure to use html dataType 
    contentType: 'application/json; charset=utf-8', 
    success: function(data){ 
     $(container).html(data); 
    }, 
    complete: function(){ } 
});  
0

मुझे यह एक लाइन कोड पूरी तरह से काम करने के लिए मिला। ऑर्डर मॉडल मेरे मॉडल ऑब्जेक्ट है। मेरे मामले में मेरे पास एक सहायक विधि थी जिसमें मुझे आंशिक दृश्य के HTML को मर्ज करना पड़ा था।

System.Web.Mvc.Html.PartialExtensions.Partial(html, "~/Views/Orders/OrdersPartialView.cshtml", orderModel).ToString(); 
संबंधित मुद्दे