2011-12-08 6 views
6

के रूप में पास करें यदि मेरे पास डायनामिक ViewBag के अंदर कोई मान है, तो मैं इसे किसी विधि में क्यों नहीं दे सकता? तो सादगी के लिए, मान लें कि मेरे पास ViewBag.SomeValue है, और मैं ViewBag.SomeValue को एक HTML सहायक में पास करना चाहता हूं। यदि HTML सहायक एक चर के रूप में गतिशील स्वीकार करता है, तो यह मेरे ViewBag.SomeValue क्यों स्वीकार नहीं करेगा? क्या आप इसे करने के लिए भेजने के लिए कोशिश कर रहे हैं -व्यूबैग को पैरामीटर

@Html.SimpleHelper(ViewBag.SomeValue) 

public static string SimpleHelper(this HtmlHelper html, dynamic dynamicString) 
{ 
    return string.Format("This is my dynamic string: {0}", dynamicString); 
} 
+0

क्या आप कुछ कोड दिखा सकते हैं? मैं एएसपीएक्स टेम्पलेट और हेल्पर्स में गतिशील उपयोग कर रहा हूं, ऐसा लगता है कि इसके लिए कोई समस्या नहीं है। –

+0

मैंने अभी अपना जवाब और जोड़ा कोड संपादित किया है। – TYRONEMICHAEL

उत्तर

8

के रूप में छोड़कर ViewBag प्रयोग करने के लिए एक नहीं कर रहा हूँ त्रुटि संदेश आपको बताता है, एक्सटेंशन विधियों को गतिशील रूप से प्रेषित नहीं किया जा सकता है। यह सिर्फ .NET में समर्थित नहीं है। इसका एएसपी.नेट एमवीसी या रेजर से कोई लेना देना नहीं है। कुछ प्रकार के लिए एक एक्सटेंशन विधि लिखने का प्रयास करें जो एक गतिशील तर्क लेता है और फिर इसे एक गतिशील चर पारित करने के लिए इस विस्तार विधि का आविष्कार करने का प्रयास करें और आपको संकलन समय त्रुटि मिल जाएगी।

@Html.SimpleHelper((string)ViewBag.SomeValue) 

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

public static class Extensions 
{ 
    public static void Foo(this object o, dynamic x) 
    { 
    } 
} 

class Program 
{ 
    static void Main() 
    { 
     dynamic x = "abc"; 
     new object().Foo(x); // Compile time error here 
    } 
} 

तो तुम कास्ट करने के लिए की जरूरत है:

निम्नलिखित सांत्वना आवेदन उदाहरण हैं जो इस दिखाता है पर विचार करें कभी भी ViewBag का उपयोग न करें। यह लाखों कारणों में से एक है क्यों व्यूबैग का उपयोग नहीं किया जाना चाहिए।

+0

धन्यवाद। अभी भी सी # में गतिशील के बारे में और जानने की जरूरत है। – TYRONEMICHAEL

+0

आप अभी भी इसे सहायक के माध्यम से रेफरी कर सकते हैं। ViewContext.Controller।व्यूबैग हालांकि नहीं? –

+0

नहीं, वापसी (स्ट्रिंग) सहायक के माध्यम से उपयोग। व्यूडाटा ["शीर्षक"]; – Ted

3
भी अधिक महत्वपूर्ण बात के बाद से ViewBag एक बुरा व्यवहार क्योंकि viewbag पर गुण के रूप में जादू तार के उपयोग करने के लिए कुछ हद तक है

। शायद एक बेहतर तरीका है? आप के माध्यम से इसे संदर्भ के लिए सहायक उदाहरण उपयोग करने के लिए सक्षम होना चाहिए:

helper.ViewContext.Controller.ViewBag

लेकिन मैं केवल शीर्षक के लिए http://completedevelopment.blogspot.com/2011/12/stop-using-viewbag-in-most-places.html

+0

मैं दृढ़ता से टाइप किए गए मॉडल का उपयोग करना पसंद करता हूं और मॉडल को सहायक में पास करता हूं। लेकिन उदाहरण के लिए कहें कि आप शीर्षक को पास करना चाहते हैं, इस मामले में एक ViewBag.SomeValue, एक HTML सहायक में। अब आप एक स्ट्रिंग घोषित कर सकते हैं और इसे व्यूबैग के बराबर बना सकते हैं और फिर स्ट्रिंग को सहायक में पास कर सकते हैं। लेकिन यह सिर्फ मार्कअप को और अधिक गन्दा बनाता है। मैंने ऊपर दिए गए कोड को और अधिक दिखाने के लिए संपादित किया है जो मैं प्राप्त करने की कोशिश कर रहा हूं। – TYRONEMICHAEL

+0

यदि आप इसे इस तरह से करना चुनते हैं तो मुझे आपके विशिष्ट मामले में एक फिक्स प्रदान करने के लिए उपरोक्त मेरा उत्तर निश्चित रूप से सुनिश्चित किया गया था। –

+0

+1 - इसे पढ़ने के बाद मुझे एहसास हुआ कि मैं कुछ बेवकूफ करने वाला था। आपने मुझे बचाया :) – Matt

0

मुझे पता है कि यह एक पुराना सवाल है, लेकिन जब मैंने इस मुद्दे की खोज की तो यह मेरे लिए आया।

व्यूबैग को विधि में गतिशील के रूप में सूचीबद्ध करके पैरामीटर के रूप में पास करने के लिए पर्याप्त आसान है। उदाहरण के लिए यहां है कि मैं व्यूबैग को कॉलम सॉर्टिंग के लिए अपने सहायक वर्गों में से एक में कैसे पास करता हूं।

public static IEnumerable<Models.MyViewModel> MyMethod(IEnumerable<Models.MyViewModel> model, string sortOrder, dynamic ViewBag) 
संबंधित मुद्दे