MVC रेजर गतिशील मॉडल, 'ऑब्जेक्ट' में 'PropertyName' की परिभाषा नहीं है


106

रेजर व्यू इंजन के साथ MVC 3 का उपयोग करना। मेरे पास यह दृश्य है:

@model dynamic
@{
    var products = (List<ListItemBaseModel>)Model.Products;
    var threshold = (int)(Model.Threshold ?? 1);
    var id = Guid.NewGuid().ToString();
}

यह इस कोड का उपयोग करके दूसरे दृश्य से कहा जाता है:

@Html.Partial("PartialViewName", new { Products = Model, Threshold = 5 })

दोनों दृश्यों में, जब मैं उन्हें डिबग करता हूं और मॉडल देखता हूं, तो यह सही ऑब्जेक्ट होता है। जब मैं कोड निष्पादित करता हूं तो मुझे "var उत्पादों =" लाइन पर एक त्रुटि मिलती है:

'ऑब्जेक्ट' में 'उत्पाद' की परिभाषा नहीं है

क्या कोई मुझे समझा सकता है कि मुझे वह त्रुटि क्यों मिली? दोबारा, जब मैं मॉडल ऑब्जेक्ट को डिबगिंग मोड में देखता हूं तो यह बिल्कुल सही लगता है (2 गुण: उत्पाद और थ्रेसहोल्ड)


जवाबों:


150

क्या आप एक अनाम वर्ग का उदाहरण मॉडल के रूप में देख रहे हैं? मैंने इसे केवल (CSHTML में डायनामिक व्यू मॉडल) आज़माया और अनाम वर्ग का उपयोग करते समय आपकी त्रुटि हुई, लेकिन यदि मैंने नामांकित वर्ग बनाया तो यह ठीक काम कर गया। मैंने खोजा, लेकिन इस दस्तावेज को कहीं नहीं देखा।

// error
return View(new { Foo = 1, Bar = "test" });

// worked
return View(new TestClass { Foo = 1, Bar = "test" });

EDIT # 1:

डेविड एब्बो के अनुसार , आप एक गुमनाम प्रकार को गतिशील रूप से टाइप किए गए दृश्य में पारित नहीं कर सकते क्योंकि अनाम प्रकारों को संकलित किया गया है internal। चूंकि CSHTML दृश्य को एक अलग असेंबली में संकलित किया गया है, इसलिए यह अनाम प्रकार के गुणों तक नहीं पहुँच सकता है।

EDIT # 2:

डेविड इबो ने इस स्पष्टीकरण के साथ अपना पद संपादित किया है:

नोट (12/22/2011): अब जब MVC 3 को डायनेमिक के लिए प्रत्यक्ष समर्थन प्राप्त है, तो नीचे दी गई तकनीक अब आवश्यक नहीं है। यह पोस्ट वास्तव में MVC में सुविधा को एकीकृत करने के लिए क्या कारण है!


1
संपादित जानकर अच्छा लगा। मुझे बस यही समस्या थी और वहां डब्ल्यूटीएफ की समझ नहीं थी। स्पष्टीकरण के लिए धन्यवाद।
यानिक रोचॉन

18
EDIT # 2 बताता है कि अब (MVC> 3) "त्रुटि" के साथ चिह्नित करना संभव है? return View(new { Foo = 1, Bar = "test" });? क्योंकि मैं एमवीसी 4 का उपयोग कर रहा हूं और अभी भी "ऑब्जेक्ट में फू के लिए परिभाषा नहीं है"
खेल

@ मुझे भी ... क्या आपने वर्कअराउंड पाया है? ( ToExpandoएक के बगल में )
एलेक्स

2
तो अब 2018 में ASP.NET Core 2.1 और रेजर व्यू का उपयोग करते हुए, मुझे लगता है कि मूल प्रश्न में त्रुटि अभी भी मुझे काट रही है। इसलिए मुझे नहीं पता कि यह एमवीसी 3 के बारे में क्या बात करता है।
एंड्रयू अरनॉट

41

.NET 4.0 पर अनाम प्रकारों को आसानी से ExpandoObjects में परिवर्तित किया जा सकता है और इस प्रकार सभी समस्याएं रूपांतरण के ओवरहेड के साथ तय हो जाती हैं। की जाँच करें यहाँ


आपका स्वागत है। हो सकता है कि यह अनाम प्रकारों को और अधिक प्रयोग करने योग्य बनाने के लिए M $
k को ले ले

क्या यह हालांकि धारावाहिकों पर लागू होता है? मैं एक त्रुटि है कि partials नहीं किया जा सकता गतिशील भेजा मिल गया ...
जॉन Bubriski

1
क्या हिस्सा? क्या आप एक उदाहरण प्रदान कर सकते हैं?
आदापाबी

27

इसका आंतरिक गुणों वाले अनाम प्रकारों से कोई लेना-देना नहीं है

यह पूरी तरह से संभव है किसी दृश्य से कोई आंशिक दृश्य के लिए अनाम प्रकार पारित करने के लिए

मैं आज भी उसी समस्या का सामना कर रहा था और अनाम प्रकार और उनके निहित होने की समस्या के साथ ऐसा करना (सीधे) कुछ भी नहीं था internal गुणों ।

जैसे, ओपी प्रश्न के संबंध में, @ लुकास द्वारा उत्तर अप्रासंगिक है - भले ही वर्कअराउंड काम करेगा

ओप्स प्रश्न में, एक गुमनाम प्रकार को विधानसभा एक्स में एक दृश्य से असेंबली एक्स में आंशिक रूप से पारित किया जा रहा है , इसलिए डेविड इबो ने जिन समस्याओं के बारे में बताया है कि गुमनाम प्रकारों के लिए आंतरिक होने के गुणों का कोई परिणाम नहीं है; दृश्य के लिए संकलित प्रकार, आंशिक और अनाम प्रकार सभी एक ही विधानसभा में निहित हैं

तो क्या एक गुमनाम से एक आंशिक से एक गुमनाम प्रकार को पारित करने में अचानक विफलता हो रही है?

कम से कम मेरी स्थिति में, मुझे पता चला कि यह SAME FOLDER में एक और दृश्य होने के कारण था जो एक मॉडल प्रकार को निर्दिष्ट करता है जिसे हल नहीं किया जा सकता है । दृश्य रनटाइम पर संकलित हो जाते हैं, और इसलिए यह समझ में आता है कि विचारों को संकलित करने के लिए रनटाइम में विफलता का मतलब गतिशील प्रकारों को संकलित करने में विफलता भी होगी और आंशिक रूप से एक प्राप्त होगाobject । यह तुरंत स्पष्ट नहीं है कि क्या चल रहा है, लेकिन ओपी में विशिष्ट उदाहरण (और मेरा) यह समस्या का कारण होने की संभावना से अधिक है।

यह ध्यान रखना दिलचस्प है कि यदि मॉडल का प्रकार सही है, लेकिन दृश्य का दूसरा भाग संकलित नहीं करता है, तो अनाम प्रकार उसी तरह प्रभावित नहीं होते हैं। यह नीचे होना चाहिए कि रेजर कैसे दृश्य के घटक भागों के गतिशील संकलन को तोड़ता है।

एक बार जब आप आपत्तिजनक दृश्य को ठीक कर लेते हैं, या तो पूरे समाधान का पुनर्निर्माण करते हैं या साफ करते हैं और जाँचने से पहले परियोजना का पुनर्निर्माण करते हैं कि क्या यह तय है।

यह सुनिश्चित करने के लिए कि आप इसे फिर से पकड़ नहीं रहे हैं आप अपनी csprojफ़ाइल में इसे जोड़कर अपने रेज़र दृश्यों के संकलन का समय सक्षम कर सकते हैं :

<PropertyGroup>
    <MvcBuildViews>true</MvcBuildViews>
</PropertyGroup>

2
इससे मेरी समस्या ठीक हो गई - "@model डायनामिक" का उपयोग करना शुरू में सही फिक्स की तरह लग रहा था, लेकिन वास्तव में मुझे गलत रास्ते पर ले जा रहा था।
क्रिमबो

मैंने समाधान को साफ कर दिया, इसे फिर से बनाया और त्रुटि दूर हो गई .. 121 अप वोट गलत हो गए।
21-06 को अधिकतम

मैंने एमवीसी 3 के बाद से गतिशील दृश्य मॉडल के लिए एमवीसी के समर्थन को प्रतिबिंबित करने के लिए अपना जवाब अपडेट किया है।
लुकास

विशाल कोड आधार के लिए समय-समय पर संकलन को सक्षम करना हमेशा उपयोगी होता है। T4MVC के साथ सभी प्रकार की समस्याओं, टाइपो, त्रुटियों को प्रकट करता है, इसके लिए मजबूत टाइपिंग के लिए धन्यवाद आदि।
डेनिस द मेनेस

ओह, ठीक है: मैंने अभी देखा है कि हम यहां एक आंशिक से एक दृश्य से गुजरने के बारे में बात कर रहे हैं। कंट्रोलर से लेकर व्यू तक नहीं, जो मेरी समस्या है।
मावरम

9

अपने समाधान में कहीं भी निम्न वर्ग जोड़ें (सिस्टम नेमस्पेस का उपयोग करें, इसलिए इसका कोई संदर्भ जोड़ने के लिए उपयोग करने के लिए तैयार है) -

    namespace System
    {
        public static class ExpandoHelper
        {
            public static ExpandoObject ToExpando(this object anonymousObject)
            {
                IDictionary<string, object> anonymousDictionary = HtmlHelper.AnonymousObjectToHtmlAttributes(anonymousObject);
                IDictionary<string, object> expando = new ExpandoObject();
                foreach (var item in anonymousDictionary)
                    expando.Add(item);
                return (ExpandoObject)expando;
            }

        }
    }

जब आप मॉडल को दृश्य में भेजते हैं, तो उसे विस्तार में बदलें:

    return View(new {x=4, y=6}.ToExpando());

1
पहले एक गतिशील वस्तु बनाने के लिए मेरे लिए एक अप्राकृतिक उपरि की तरह लगता है और फिर एक ExpandoObject बनाएँ ... बस इसके बजाय ExpandoObject बनाएँ ..
Baz1nga

@ Baz1nga आप ऐसा नहीं कर सकते ... नया विस्तारक () {प्रोप = मान, ...}, जो इसे समस्याग्रस्त बनाता है। मैं इसी तरह के उपयोग के लिए Json.Net के जोबजेक्ट का उपयोग कर रहा हूं।
ट्रैकर 1

3
इसमें HtmlHelper का होना गलत लगता है ... सार्वजनिक स्थैतिक ExpandoObject ToExpando (यह ऑब्जेक्ट o) {IDfox <string, object> extensiono = new ExtendedoObject (); foreach (var propertyInfo in o.GetType ()। GetProperties ()) {Expando.Add (नया KeyValuePair <string, object> (propertyInfo.Name, propertyInfo.Getteralue (o, index: null))); } रिटर्न (एक्सपेंडीओबजेक्ट) एक्सपैंडो; }
एरलैंडो

6

बजाय dynamicआंशिक दृश्य के भीतर मॉडल प्रकार का उपयोग करने के लिए ।

आप @ViewData.Eval("foo")इसके बजाय का उपयोग करके अनाम ऑब्जेक्ट विशेषताओं को कॉल कर सकते हैं @Model.foo

तब आप @Model dynamicदृश्य से हटा सकते हैं।

मैं इस मुद्दे पर हाल ही में आया जब फेसबुक सोशल कमेंट्स इंटीग्रेशन के लिए विचारों के बीच कुछ विशेषताओं को पारित कर रहा था। उदाहरण कोड:

Html.RenderPartial(@"Layouts/Partials/_Comments", new {currentUrl = Model.CurrentPage.GetAbsoluteUrl(), commentCount = 5 });

तब मेरे विचार में मेरे पास सिर्फ यह div था:

<div class="fb-comments" data-href="@ViewData.Eval("currentUrl")" data-numposts="@ViewData.Eval("commentCount")" data-width="100%"></div>

0

मुझे यकीन नहीं है कि आपको यह त्रुटि मिल रही है क्योंकि आप कार्य को लागू नहीं कर रहे हैं। मुझे एक आंशिक दृश्य में वही त्रुटि मिली। समाधान सिर्फ निर्माण को साफ करने और इसे पुनर्निर्माण करने के लिए था। यदि सिंटैक्स सही है, तो कोड को काम करना चाहिए, लेकिन रेजर इंजन कोड परिवर्तनों को ठीक से अपडेट नहीं कर रहा है।



-6

dynamicटाइप का उपयोग करने के लिए आपको Microsoft.CSharpअसेंबली का संदर्भ देना होगा

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.