2010-03-15 17 views
13

ऐसा प्रतीत होता है कि Asp.Net MVC2 ऐप्स में Html.RenderAction को कॉल करना पृष्ठ के माइम प्रकार को बदल सकता है यदि बाल क्रिया का प्रकार पैरेंट एक्शन के मुकाबले अलग है।Asp.Net MVC2 रेंडरएक्शन पृष्ठ माइम प्रकार बदलता है?

नीचे दिया गया कोड (एमवीसी 2 आरटीएम में परीक्षण), जो मुझे समझ में आता है, Home/Index पर कॉल करते समय application/json का परिणाम लौटाएगा। पृष्ठ को डिस्प्ले करने के बजाय, ब्राउजर बार्फ़ करेगा और आपको पूछेगा कि क्या आप इसे डाउनलोड करना चाहते हैं।

मेरा प्रश्न: क्या मुझे कुछ याद आ रही है? क्या यह एक बग है? यदि हां, तो सबसे अच्छा कामकाज क्या है?

नियंत्रक:

public class HomeController : Controller 
{ 
    public ActionResult Index() 
    { 
     ViewData[ "Message" ] = "Welcome to ASP.NET MVC!"; 

     return View(); 
    } 

    [ChildActionOnly] 
    public JsonResult States() 
    { 
     string[] states = new[] { "AK", "AL", "AR", "AZ", }; 

     return Json(states, JsonRequestBehavior.AllowGet); 
    } 
} 

दृश्य:

<h2><%= Html.Encode(ViewData["Message"]) %></h2> 
<p> 
    To learn more about ASP.NET MVC visit <a href="http://asp.net/mvc" title="ASP.NET MVC Website">http://asp.net/mvc</a>. 
</p> 
<script> 
    var states = <% Html.RenderAction("States"); %>; 
</script> 

उत्तर

8

यह एक बग नहीं है। JsonResult प्रकार जेएसओएन को परिणाम सेट करना है, क्योंकि आमतौर पर यह वही है जो आप चाहते हैं।

आप नहीं है वास्तव में एक JSON परिणाम यहाँ चाहते हैं, आप एक JSON स्ट्रिंग चाहते हैं। तो क्यों न सिर्फ यह लिखें?

[NonAction] 
public string States() 
{ 
    string[] states = new[] { "AK", "AL", "AR", "AZ", }; 

    return new JavaScriptSerializer().Serialize(states); 
} 
+5

यह काम करेगा ... ऐसा लगता है कि एक बच्चे की कार्रवाई पूरे पृष्ठ के ContentType को बदलने में सक्षम नहीं होना चाहिए। –

+0

ध्यान दें कि जावास्क्रिप्टसेरियलाइज़र()। सीरियलाइज जेसन विधि के विपरीत, एम्बेडेड कोट्स को सही ढंग से क्रमबद्ध नहीं करता है। आपको कुछ की आवश्यकता होगी: Func safeForJson = (s) => { वापसी s.NotNull()। बदलें ("\" "," \\\ ""); }; –

+0

क्षमा करें, NotNull विधि मेरा है लेकिन केवल यह सुनिश्चित करता है कि इनपुट स्ट्रिंग शून्य (नाच) नहीं है। –

3

यह स्पष्ट रूप से text/html को माइम प्रकार "वापस" के लिए मजबूर द्वारा हल किया जा कर सकते हैं:

return Json(states, "text/html", JsonRequestBehavior.AllowGet); 

यह इस तरह आवश्यक होना चाहिए, हालांकि प्रतीत नहीं होता।

+1

यह समस्या को हल करने के रूप में इतना हल नहीं करता है। 'JsonResult' अभी भी' ContentType 'को यहां बदलता है; यह सिर्फ उस चीज़ को बदलता है जिसे आप (वर्तमान में!) उम्मीद करते हैं। –

+0

और मेरे लिए यह सिर्फ जेसन परिणाम के साथ एक टेक्स्ट फ़ाइल देता है ... क्या यह सिर्फ मुझे है या यह कचरा अविश्वसनीय रूप से छोटी है ... इस बकवास को किसने लिखा? – SoftwareSavant

1

Craig Stuntz said की तरह सामग्री प्रकार को बदलना चाहिए।

एक बेहतर तरीका AJAX के साथ उस क्रिया को कॉल करेगा और फिर लौटा ऑब्जेक्ट को states चर को जावास्क्रिप्ट कोड में असाइन करेगा।

+1

क्या आप एक ऐसे परिदृश्य का सुझाव दे सकते हैं जिसमें यह व्यवहार (बाल क्रिया बदलने वाले पृष्ठ की सामग्री प्रकार) वास्तव में आप क्या करना चाहते हैं? –

+0

@Gabe Moothart, मैं उस परिदृश्य के बारे में नहीं सोच सकता जहां आप ऐसा करना चाहते हैं। लेकिन बात यह है कि समस्या ContentType में बदलाव नहीं है। समस्या ** ** जेसन ** ** एचटीएमएल ** दृश्य प्रस्तुत करते समय परिणाम का आह्वान कर रही है। JsonResult अनुरोध ऑब्जेक्ट्स ContentType प्रॉपर्टी को 'एप्लिकेशन/जेसन' पर सेट करता है जैसा कि यह माना जाता है। लेकिन दुर्भाग्यवश, चूंकि आप इसे HTML व्यू से कॉल करते हैं, इसलिए मूल प्रतिक्रिया का प्रकार बदलता है जैसा आप देखते हैं। –

8

मैं इसे एक बग पर विचार करता हूं। यदि यह बच्चा कार्रवाई प्रदान की जा रही है, तो यह पैरेंट कार्रवाई प्रतिक्रिया क्यों बदलेगी? एचटीएमएल.एक्शन के साथ ऐसा ही होता है, जो इसे स्ट्रिंग में प्रस्तुत करता है। मेरा कामकाज कर रहा है:

Html.ViewContext.HttpContext.Response.ContentType = "text/html"; 

HTML.Action को कॉल करने के बाद।

var aux = Html.ViewContext.HttpContext.Response.ContentType; 
Html.Action(....); // or Html.RenderAction(...) 
Html.ViewContext.HttpContext.Response.ContentType = aux; 
4

तुम कुछ भूल रहे हैं नहीं (जब तक कि मैं भी कर रहा हूँ) और मुझे लगता है कि यह एक बग है: मैं किसी को एक आवरण एचटीएमएल हेल्पर एक्सटेंशन की तरह कुछ लिख सकता है लगता है। मेरे पास एएसपी.नेट एमवीसी 3 में एक ही समस्या है।

हमारे पास एक नियंत्रक क्रिया है जो एक साधारण सामग्री प्रबंधन प्रणाली से सामग्री लौटाती है। सीएमएस उपयोगकर्ता को लौटाए गए सामग्री प्रकार को परिभाषित करने की अनुमति देता है (उदाहरण के लिए टेक्स्ट/सादा या टेक्स्ट/एक्सएमएल)।

नियंत्रक कार्रवाई को या तो सीधे कहा जाता है, या एक बच्चे के क्रिया के रूप में कहा जाता है ताकि सामग्री प्रबंधित तत्वों को देखने के लिए अनुमति दी जा सके।

यदि सामग्री का एक टुकड़ा "टेक्स्ट/सादा" सामग्री प्रकार के साथ बनाया गया है, और यह एएसपी.नेट एमवीसी व्यू पर एम्बेडेड है, तो माता-पिता का सामग्री प्रकार ओवरराइड किया गया है और ब्राउजर एचटीएमएल प्रदर्शित करता है।

गेबे, मुझे लगता है कि आपने सिर पर नाखून मारा है जिसमें ऐसा परिदृश्य नहीं दिखता है जहां माता-पिता को ओवरराइड करने वाला बच्चा एक वांछनीय परिणाम है।

मेरा समाधान ControllerContext.IsChildAction पर शाखा बनाना है और अपनी खुद की वापसी वस्तु का निर्माण करना है, लेकिन मेरी राय में यह कुछ है जो ढांचे द्वारा संभाला जाना चाहिए।

मुझे यकीन है कि आप इसके बारे में जानते हैं, लेकिन आपके मामले में मैं स्पष्ट रूप से माता-पिता के सामग्री प्रकार में JsonResult.ContentType सेट करने का सुझाव दूंगा।

1

मुझे आज समस्या थी। कारण मुझे पृष्ठ पर कुछ जेसन डेटा को पॉप्युलेट करने के लिए मौजूदा बाल कार्रवाई का पुन: उपयोग करने की आवश्यकता थी ताकि अनावश्यक AJAX अनुरोधों से बचा जा सके।

जेमी और निव के विचार के आधार पर, मैंने निम्नलिखित सहायक विधि बनाई। Html.Action के बजाय

public static MvcHtmlString ChildAction(this HtmlHelper htmlHelper, ActionResult result) 
{ 
    var aux = htmlHelper.ViewContext.HttpContext.Response.ContentType; 
    var actionResult = htmlHelper.Action(result); 
    htmlHelper.ViewContext.HttpContext.Response.ContentType = aux; 
    return actionResult; 
} 

कॉल Html.ChildAction आप बच्चे को कार्रवाई कि json डेटा रिटर्न का परिणाम उपयोग करने की आवश्यकता है।

+0

धन्यवाद, मुझे यह कामकाज पसंद है, यह सबसे साफ लगता है। मैं सिर्फ "MimePreserveChildAction" उदाहरण के लिए एक्सटेंशन का नाम बदलूंगा, इसलिए यह अन्य डेवलपर्स के लिए स्पष्ट है कि इस विधि का उद्देश्य क्या है। –

संबंधित मुद्दे