2012-02-06 16 views
20

के रूप में पास रेजर मार्कअप मेरे पास EditableArea नामक एक सहायक है जो उपयोगकर्ता को रनटाइम-संपादन योग्य div (जेएस के माध्यम से) प्रदान करता है।एएसपी.नेट एमवीसी 3 - पैरामीटर

: EditableArea सहायक जांच करता है कि एक संपादन योग्य क्षेत्र निर्दिष्ट आईडी के साथ (MVC के Area से संबंधित नहीं) डीबी में मौजूद है, यदि ऐसा है तो फिर यह क्षेत्र के एचटीएमएल प्रस्तुत हुई है, अन्यथा यह डिफ़ॉल्ट मार्कअप सहायक के लिए एक पैरामीटर के रूप में निर्दिष्ट प्रदर्शित करता है

यह सब ठीक काम करता है, लेकिन इतना है कि डिफ़ॉल्ट मार्कअप नहीं स्ट्रिंग के रूप लेकिन उस्तरा वाक्य रचना में निर्दिष्ट किया जाता है मैं इसे बदलना चाहते हैं, कुछ की तरह:

@using (Html.EditableArea(someId)) 
{ 
    <p>Click to edit contents</p> 
} 

या, उसी तरह जैसे कुछ @section रों एमवीसी 3 में काम करें।

मैं इसे कैसे प्राप्त कर सकता हूं?

मैं एक IDisposable जिसमें यह Dispose बंद कर देता है TagBuilder, आदि है बना सकते हैं, लेकिन मैं सहायक एक आईडी के साथ एक क्षेत्र पाता है, भले ही आंतरिक उस्तरा मार्कअप प्रतिपादन से बचने नहीं कर सकते हैं (मैं निपटान में प्रदान की गई सामग्री को साफ कर सकते हैं() लेकिन {} के अंदर कोड अभी भी चलाएगा, जिसे मैं छोड़ना चाहता हूं)।

और यदि मैं using का उपयोग नहीं करता हूं तो सहायक के लिए रेजर ब्लॉक पास करने का कोई और तरीका है, जो वास्तव में सहायक द्वारा प्रदान किया जा सकता है या नहीं?

उत्तर

25

यहाँ एक उदाहरण मैं स्वयं टेम्पलेट के लिए आईडी और उस्तरा शैली वाक्य रचना एक टेम्पलेट में पारित करके jQuery खाका मार्कअप रेंडर करने के लिए उपयोग करें:

public static MvcHtmlString jQueryTmpl(this HtmlHelper htmlHelper, 
    string templateId, Func<object, HelperResult> template) 
{ 
    return MvcHtmlString.Create("<script id=\"" + templateId + 
     "\" type=\"x-jquery-tmpl\">" + template.Invoke(null) + "</script>"); 
} 

और इस

@Html.jQueryTmpl("templateId", @<text>any type of valid razor syntax here</text>) 

साथ ही कहा जाता है मूल रूप से इसे Func<object, HelperResult> का उपयोग अपने पैरामीटर के रूप में करें और template.Invoke(null) (यदि आवश्यक हो तो तर्क के साथ) इसे प्रस्तुत करने के लिए। स्पष्ट रूप से आप "डिफ़ॉल्ट" मार्कअप को प्रस्तुत करने से बचने के लिए कॉल को .Invoke() पर छोड़ सकते हैं।

+0

यह काम नहीं करता है। ' ... 'फ़ंक्शन कॉल के अंदर वाक्यविन्यास को पहचाना नहीं जा रहा है (अमान्य अभिव्यक्ति शब्द' <') –

+0

क्षमा करें,' @12 ''के साथ' @' (मैंने अपना उत्तर अपडेट किया) –

+1

ग्रेट, अब यह काम करता है।' 'टैग की आवश्यकता नहीं है (' @ 'पर्याप्त है) जब तक कि रेजर मार्कअप वास्तव में किसी भी टैग के बिना सादा पाठ नहीं है, अन्यथा केवल' @ 'पर्याप्त है। –

3

स्वीकार्य उत्तर पर विस्तार करने के लिए, क्योंकि मुझे एक ही समस्या को हल करने में काफी समय लगा और यह सवाल उठ गया। मुझे वास्तव में एक @helper था, जो रेज़र टेक्स्ट स्वीकार करेगा, क्योंकि टेम्पलेट में कुछ कोड होना चाहिए। मैंने @helper item(Func<object, HelperResult> input) के कई संस्करणों का उपयोग करने की कोशिश करते हुए लंबे समय तक खेला, जो कि मैंने वेब पर पाया, बिना किसी सफलता के। के माध्यम से

@item(other input, @Html.RazorToMvcString(@<text>this is a test</text>)) 

namespace project.MvcHtmlHelpers 
{ 
    public static class HelperExtensions 
    { 
     public static MvcHtmlString RazorToMvcString(this HtmlHelper htmlHelper, Func<object, HelperResult> template) 
     { 
      return MvcHtmlString.Create(template.Invoke(null).ToString()); 
     } 
    } 
} 

और

@project.MvcHtmlHelpers  
@helper item(other input, MvcHtmlString content) 
    { 
     <div class="item"> 
      ...other stuff... 
      <div class="content"> 
       @content 
      </div> 
     </div> 
    } 

और इस का उपयोग अब मैं दोनों उस्तरा इनपुट के लिए सहायक टेम्पलेट का उपयोग कर सकते हैं, लेकिन मैं यह भी कर सकते हैं: इसलिए मैं की तरह एक दृष्टिकोण के लिए चला गया आंशिक विचारों में गिरावट, जो कुछ बिंदुओं पर आसान है। चूंकि मैं कोई विशेषज्ञ नहीं हूं, वहां बेहतर विकल्प हो सकते हैं, लेकिन यह मेरे लिए एक लचीला दृष्टिकोण जैसा लगता है।

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