2011-11-23 18 views
6

पर काम नहीं कर रहा है कम से कम, मुझे लगता है कि यह समस्या से संबंधित है। मेरा परिदृश्य यह है:EditorFor व्युत्पन्न प्रकार

मेरे पास सामान्य फ़ील्ड के साथ कई व्यावसायिक संस्थाएं हैं, और प्रत्येक के पास उस इकाई के लिए अद्वितीय फ़ील्ड अद्वितीय हैं। तो कोड में, इसे EntityBase वर्ग के रूप में मॉडलिंग किया गया है, और इसमें से कई वर्ग व्युत्पन्न हैं, उदाहरण के लिए, Derived

@ModelType EntityBase 

@Using Html.BeginForm("Edit", Model.GetType.Name) 
    @* show the editor template for the derived type *@ 
    @* !!the next line renders nothing!! *@ 
    @Html.EditorFor(Function(x) Model, Model.GetType.Name) 

    [show a bunch of stuff common to all EntityBase objects] 
End Using 

और फिर एक व्युत्पन्न वर्ग है कि यह करता है के लिए Derived.vbhtml कहा जाता है:

@ModelType Derived 
[show an EditorFor for various Derived-specific fields] 

एक पुन: प्रयोज्य यूआई बनाने के लिए, मैं एक दृश्य EntityBase.vbhtml कहा जाता है कि इस तरह दिखता है मिल गया है फिर, जब आप \Derived\Edit\123 पर नेविगेट करते हैं, तो यह डिफ़ॉल्ट दृश्य Derived\Edit.vbhtml देता है, जो यह करता है:

@Html.EditorForModel("EntityBase") 

इस तरह, नियंत्रक केवल अपेक्षित डिफ़ॉल्ट संपादन दृश्य को वापस करते हैं, जो EntityBase व्यू के लिए एक-लाइनर कॉल है, जो इसकी बात करता है और व्युत्पन्न क्लास सामग्री को प्रस्तुत करने के लिए Derived को आमंत्रित करता है, जिसके बारे में इसका कोई ज्ञान नहीं है।

मैंने सोचा कि यह अपरिहार्य था, लेकिन यह काम नहीं करता है। जैसा कि दृश्य कोड में चिह्नित किया गया है, जब मैं बेस क्लास व्यू के भीतर EditorForModel को कॉल करता हूं, टेम्पलेट के रूप में उपयोग के लिए व्युत्पन्न कक्षा का नाम निर्दिष्ट करता हूं, तो यह कुछ भी प्रस्तुत नहीं करता है। मैंने परीक्षण किया है कि यदि मैं शीर्ष स्तर पर कोड की इस सटीक रेखा को कॉल करता हूं तो टेम्पलेट संपादित करें, यह ठीक काम करता है। तो विरासत के बारे में कुछ है जो एमवीसी पसंद नहीं करता है, लेकिन मैं नहीं देख सकता। कृपया सहायता कीजिए!

अद्यतन: यह काम करता है के रूप में मैं क्योंकि मुझे लगता है कि यह नहीं करने के लिए भ्रामक है EditorFor मैं Partial का उपयोग करने के बजाय अगर उम्मीद (और EditorTemplates फ़ोल्डर से साझा फ़ोल्डर में इसी टेम्पलेट ले जाते हैं) होता है, लेकिन यह एक महान समाधान नहीं है EditorFor टेम्पलेट्स के लिए नामकरण सम्मेलन का पालन करें।

उत्तर

3

ऐसा प्रतीत होता है कि, जबकि एमवीसी इस परिस्थिति में नामित टेम्पलेट का पता नहीं लगाएगा, तो यह आपको मिलेगा यदि आप टेम्पलेट के लिए पूर्ण पथ निर्दिष्ट करते हैं।

<Extension()> _ 
Public Function EditorForObject(Of T, TValue)(ByVal htmlHelper As HtmlHelper(Of T), ByVal obj As TValue) As IHtmlString 
    Dim sTemplateName = "~/Views/Shared/EditorTemplates/" & obj.GetType.Name & ".vbhtml" 

    'Return htmlHelper.EditorFor(Function(x) obj) <-- this should work but doesn't 
    Return htmlHelper.Partial(sTemplateName, obj) 
End Function 

अंग्रेजी में, इसका मतलब:, अपने प्रकार नाम के लिए वस्तु चाहते हैं कि प्रकार के लिए संपादक टेम्पलेट को स्पष्ट पथ के रूप में, और तो, बजाय यह किसी भी आगे की लड़ाई, मैं निम्नलिखित सहायक समारोह लागू किया फिर ऑब्जेक्ट निर्दिष्ट करें और टेम्पलेट के लिए पूर्ण पथ HtmlHelper.Partial का आह्वान करें। मुझे यकीन है कि यह अधिक सामान्य हो सकता है (और vb के लिए हार्डकोड नहीं किया गया है), लेकिन यह काम करता है।

तब उपयोग इस तरह है:

@Html.EditorFor(Function(x) Model, Model.GetType.Name) 

भी टेम्पलेट देखने के बिना:

@Html.EditorForObject(Model) 

और वास्तव में, यह मैं क्या जो बहुत मेसियर है ऐसा करने के लिए, कोशिश कर रहा था से भी बेहतर है समस्या, यह आसान होगा, क्योंकि यह उस ऑब्जेक्ट को वापस लौटने वाले डमी लैम्ब्डा की बजाय संपादन (या प्रदर्शन) के लिए ऑब्जेक्ट को पास करने में सक्षम होना सुविधाजनक है।

फिर भी, मुझे लगता है कि लुकअप समस्या एमवीसी में एक बग होना चाहिए। (अगर मुझे कभी समय मिलता है, तो मुझे लगता है कि मैं स्रोत कोड देख सकता हूं।) क्या कोई इस पर पुष्टि या टिप्पणी कर सकता है?

+0

मुझे एक ही समस्या का सामना करना पड़ा। एक महान कामकाज के लिए धन्यवाद। मैं बस हारने वाला था :) –

+0

इसे सुनकर खुशी हुई! मैं वास्तव में इस पर अपने बालों को फाड़ा। –

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