2011-02-11 12 views
28

निर्दिष्ट करने का प्रयास करें, कृपया कोई मेरे लिए कुछ स्पष्टीकरण दे सकता है।प्रकार तर्कों को उपयोग से अनुमानित नहीं किया जा सकता है। टाइप तर्कों को स्पष्ट रूप से

public virtual IDictionary<string, object> GetHtmlAttributes<TModel, TProperty> 
         (Expression<Func<TModel, TProperty>> propertyExpression) 
{ 
    return new Dictionary<string, object>(); 
} 

विचार किया जा रहा है कि प्रत्येक बच्चे viewmodel इस विधि को ओवरराइड और एचटीएमएल विशेषताओं का एक उपयुक्त सेट प्रदान कर सकते हैं, के आधार: मेरे ASP.NET MVC 2 एप्लिकेशन में, मैं एक BaseViewModel वर्ग जो निम्न विधि भी शामिल है मिल गया है कुछ तर्क पर, ध्यान में रखते हुए प्रदान करने की:

<%: Html.TextBoxFor(model => model.MyProperty, Model.GetHtmlAttributes 
               (model => model.MyProperty)) %> 

लेकिन जब ऊपर लाइन में के रूप में इस्तेमाल, मैं एक संकलन त्रुटि मिलती है जब मैं दृश्य मारा: के लिए मुलाकात की

प्रकार तर्क होड '...BaseViewModel.GetHtmlAttributes<TModel,TProperty> Expression<System.Func<TModel,TProperty>)' उपयोग से अनुमानित नहीं किया जा सकता है। प्रकार तर्कों को स्पष्ट रूप से निर्दिष्ट करने का प्रयास करें।

मैं निम्नलिखित करना है:

<%: Html.TextBoxFor(model => model.MyProperty, Model.GetHtmlAttributes 
          <ChildModel, string>(model => model.MyProperty)) %> 

मैं बस कुछ स्पष्टता के लिए देख रहा हूँ के रूप में यह कैसे प्रकार का अनुमान लगा की कोशिश करता है, यह कोई समस्या नहीं HtmlHelper/TextBoxFor विस्तार विधि में ऐसा करने की है? क्योंकि ध्यान में रखते हुए HtmlHelper स्वचालित रूप से, के रूप में पेज के शीर्ष पर ViewUserControl में निर्दिष्ट किया जाता एक ही प्रकार के लिए किया जाएगा, जबकि मेरी कोड किसी भी प्रकार BaseViewModel से इनहेरिट के लिए किया जा सकता है

यह है? इस तरह से लिखना संभव है कि यह मेरे मॉडल/संपत्ति प्रकारों का अनुमान लगा सकता है?

+5

पवित्र क्षैतिज स्क्रॉलबार बैटमैन! –

+2

हाँ पूरी तरह से। इन छोटे खिड़कियों में स्क्रॉलिंग कोड के लिए हमारे 30 "मॉनीटरों पर यह बेतुका है कि हमें केवल 6.5 मिलते हैं"। एसए दोस्तों पर आओ, अपना वीसी पैसा लें और गतिशील पेज आकार के साथ जाओ! – Slaggg

उत्तर

11

आपके उदाहरण में, कंपाइलर को यह जानने का कोई तरीका नहीं है कि किस प्रकार TModel होना चाहिए। आप एक विस्तार विधि के साथ संभवतः क्या करने की कोशिश कर रहे हैं उसके करीब कुछ कर सकते हैं।

static class ModelExtensions 
{ 
    public static IDictionary<string, object> GetHtmlAttributes<TModel, TProperty> 
     (this TModel model, Expression<Func<TModel, TProperty>> propertyExpression) 
    { 
     return new Dictionary<string, object>(); 
    } 
} 

लेकिन आप virtual के लिए इसी तरह कुछ भी करने में सक्षम नहीं होगा, मुझे लगता है।

संपादित करें:

असल में, आप virtual कर सकते हैं, स्वयं निर्देशात्मक जेनरिक का उपयोग कर:
वेब में:

class ModelBase<TModel> 
{ 
    public virtual IDictionary<string, object> GetHtmlAttributes<TProperty> 
     (Expression<Func<TModel, TProperty>> propertyExpression) 
    { 
     return new Dictionary<string, object>(); 
    } 
} 

class FooModel : ModelBase<FooModel> 
{ 
    public override IDictionary<string, object> GetHtmlAttributes<TProperty> 
     (Expression<Func<FooModel, TProperty>> propertyExpression) 
    { 
     return new Dictionary<string, object> { { "foo", "bar" } }; 
    } 
} 
-3

आप उदाहरण के बजाए प्रकार का जिक्र कर रहे हैं। अपने दूसरे और चौथे कोड के नमूने में उदाहरण में 'मॉडल' लोअरकेस बनाएं।

Model.GetHtmlAttributes 

होना चाहिए

model.GetHtmlAttributes 
+0

सुझाव के लिए धन्यवाद, लेकिन मुझे इसे एक मॉडल ऑब्जेक्ट का एक विशिष्ट उदाहरण देने की आवश्यकता है (दृश्य की मॉडल संपत्ति का खुलासा किया)। 'मॉडल' वास्तव में TextBoxFor सहायक के HTMLAttributes पैरामीटर के संदर्भ में मौजूद नहीं है। –

3

सी # संकलक आर्ग के अनुमान का प्रकार (TModel) arg.MyProperty (TProperty) के एक प्रकार के लिए केवल लैम्ब्डा

arg => arg.MyProperty 

है। यह नामुमकिन है।

14

मैं इस एक ही समस्या है, मेरी समाधान था।कॉन्फ़िग फ़ाइल:

<compilation debug="true>

<compilation debug="true" targetFramework="4.0">

+1

धन्यवाद बहुत कम जिम! आपने अपना दिन बचा लिया है, मैंने दिनों के लिए गुगल किया और मुख्य प्रश्नों पर कोई समाधान नहीं मिला लेकिन फिर यहां अपनी छोटी टिप्पणी में ढूंढें! मैं वीएस 2012 का उपयोग कर रहा हूं जो एमवीसी 4.0 के साथ आता है, और हां लक्ष्यफ्रेमवर्क = "4.0" को जोड़ने से व्यूबैग, एचटीएमएल के तहत लाल रेखाओं की समस्याएं हल हुईं। टेक्स्टबॉक्स फॉर इत्यादि। – Nestor

+0

मैंने एक नया [अधिक संबंधित शीर्षक के साथ प्रश्न] खोला [http : //stackoverflow.com/questions/13695497/visual-studio-red-lines-under-viewbag-and-html-textboxfor-helpers-in-views/13695498#13695498), आपके उत्तर का उपयोग किया और इसके लिए क्रेडिट है। उम्मीद है कि यह दूसरों की मदद करता है। – Nestor

+0

धन्यवाद जिम, आपने मेरा दिन बचाया। क्या आप समझा सकते हैं कि यह लक्ष्य फ़्रेमवर्क क्यों महत्वपूर्ण है? आपने इसे कैसे समझ लिया? – Vincent

17

को परिवर्तित करने की मैं जानता हूँ कि इस सवाल का पहले से ही स्वीकार किए जाते हैं जवाब है, लेकिन मेरे लिए, एक .NET शुरुआत, वहाँ मैं क्या था करने के लिए एक सरल उपाय था गलत कर रहा है और मैंने सोचा कि मैं साझा करूंगा।

मैं यह कर दिया गया था:

@Html.HiddenFor(Model.Foo.Bar.ID) 

क्या मेरे लिए काम किया यह करने के लिए बदल रहा था:

@Html.HiddenFor(m => m.Foo.Bar.ID) 

(जहां "एम" मॉडल वस्तु का प्रतिनिधित्व करने के लिए एक मनमाना स्ट्रिंग है)
0

यदि यह मदद करता है, तो null को जेनेरिक TValue के पैरामीटर में पास करने के दौरान, इस समस्या को हल करने के लिए, आपको अपने शून्य मानों को डालना होगा:

(string)null 

(int)null 

आदि

4

यह त्रुटि एक कैश मुद्दे के साथ संबंधित है।

मैं एक ही समस्या थी और यह सिर्फ समाधान फिर से निर्माण और सफाई हल किया गया था।

+1

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

+1

इस पर आया और यह मेरे लिए भी कैशिंग था! – lozzajp

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

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