2010-12-15 14 views
48

मैं एक सरल कथात्मक एचटीएमएल सहायक लिखने के लिए कोशिश कर रहा हूँ:उस्तरा: घोषणात्मक एचटीएमएल सहायकों

@helper Echo(string input) { 
    @input 
} 

सहायक ठीक काम करता है अगर मैं इसे पेज मैं इस पर उपयोग करना चाहते हैं में एम्बेड। लेकिन अगर मैं इसे .cshtml फ़ाइल पर अलग करता हूं और ~/Views/Helpers निर्देशिका में उस फ़ाइल को स्थानांतरित करता हूं, तो मेरा दृश्य अब संकलित नहीं किया जा सकता क्योंकि सहायक नहीं मिला है। स्कॉट गु के blog article on Razor के अनुसार यह काम करना चाहिए।

मैं क्या गलत कर रहा हूं?

+0

मुझे पूरा यकीन है कि सहायक अभी तक एक अलग दृश्य में सक्षम नहीं हैं। मुझे पता है कि यह काम करता है हालांकि। – Buildstarted

उत्तर

47

~/Views/Helpers स्थान स्कॉटगु पोस्ट में वर्णन के रूप में स्थान एमवीसी 3 आरटीएम में काम नहीं करेगा। जब लेख लिखा गया था, यह एक डिजाइन विचार था जिसे हम चारों ओर फेंक रहे थे लेकिन आखिरकार हम इसे लागू करने में सक्षम नहीं थे।

App_Code में अपने सहायकों लाना काम करता है लेकिन कुछ सीमाएँ हैं कि कुछ MVC परिदृश्यों प्रभाव पड़ता है (उदाहरण के लिए: मानक MVC Html. सहायकों के लिए पहुँच नहीं)

+5

क्या इसका मतलब यह है कि घोषणात्मक HTML सहायक प्रभावी रूप से मर चुके हैं? नियमित आंशिक दृश्य पर लाभ कहां है? –

+0

वे मर नहीं गए हैं और हम कुछ ऐड-ऑन प्रदान करने के बारे में सोच रहे हैं (एमवीसीफ्यूचर, या न्यूजेट पैकेज के माध्यम से) जो समस्याओं का समाधान करेगा। लेकिन इस बिंदु पर उनका भविष्य "अस्पष्ट" है। – marcind

+0

मैंने इसे थोड़ा सा खोला है और App_Code फ़ोल्डर में घोषणात्मक @helpers के लिए 'Html.' विधियों का समर्थन करने के लिए एक प्रश्न/प्रस्ताव है। क्या आपके पास हो सकता है एक नज़र डालें और देखें कि यह काम करेगा या नहीं? http://stackoverflow.com/questions/5282655/why-is-the-htmlhelper-instance-null-in-a-razor-declarative-helper-method/5282713#5282713 –

6

मैंने स्कॉट के ब्लॉग में सूचीबद्ध चरणों का भी पालन किया और इसे या तो काम करने में सक्षम नहीं था।

मैं कुछ खोज किया था और इस लिंक मिल गया: http://dotnetslackers.com/articles/aspnet/Experience-ASP-NET-MVC-3-Beta-the-Razor-View-Engine.aspx#s19-create-custom-helper-method

चरणों का पालन किया है और यह काम कर रहा है। हेल्पर को कॉल करते समय कुंजी ऐप_Code फ़ोल्डर दोनों के साथ-साथ फ़ाइल नाम डॉट हेल्पर नाम का उपयोग करने लगती है।

+0

मुझे विश्वास नहीं है कि जिस तरह से रेजर हेल्पर्स काम करना चाहते हैं, लेकिन यह एक अच्छा कामकाज है। आपका बहुत बहुत धन्यवाद! –

+0

दुर्भाग्य से dotnetslackers.com वेबसाइट अब मौजूद नहीं है। यदि आपने इनमें से कुछ उद्धृत किया है या लेख का शीर्षक पोस्ट किया है, तो मुझे Google का उपयोग करके अन्यत्र लेख मिल सकता है यदि इसे कहीं और प्रकाशित किया गया हो। :-( – ChrisW

9

As marcind said, हम नहीं ~/Views/Helpers स्थान समर्थन करने में सक्षम कुछ की वजह से थे हमारे संकलन मॉडल में सीमाएं।

हम घोषणात्मक एचटीएमएल सहायकों के लिए बेहतर समाधान पर काम कर रहे हैं, लेकिन यह v1 नहीं बनायेगा।

  1. App_Code (जो कुछ समस्याओं मार्सिन उल्लेख किया है, लेकिन करता है काम)
  2. डेविड Ebbo (टीम के सदस्य) a Visual Studio add-in that compiles them into your DLL
+0

क्या एमवीसी 3 अंतिम रिलीज अब इसका समर्थन करता है? – xport

+0

@ रीसायकल बिन - स्पष्ट रूप से नहीं। –

+0

नहीं मैंने यह सत्यापित किया कि यहां एक और पोस्ट के साथ: http://stackoverflow.com/questions/4988135/declarative-helper-methods-in-razor-rtm –

35

सरल समाधान का है: v1 के लिए, हम दो समाधान है:

प्रत्येक सहायक में तर्क WebViewPage पृष्ठ जोड़ें।

App_Code \ Test.cshtml:

@using System.Web.Mvc.Html 
@using System.Web.Mvc 

@helper HelloWorld(WebViewPage page) 
{ 
    @page.Html.Label("HelloWorld") 
} 

किसी भी पेज में यह सहायक उपयोग:

@Test.HelloWorld(this) 
+0

यह काम नहीं दिखता है - पृष्ठ। एचटीएमएल में लेबल (या अन्य सहायक सहायक तरीकों में से कोई भी नहीं) –

+0

सहायक विधि लेबल (और अन्य) एक्सटेंशन है, जिसे सिस्टम सिस्टम.Web.Mvc.Html.LabelExtension में घोषित किया गया है। System.Web.Mvc.Html –

+2

का उपयोग करके जोड़ें मेरे मामले में बहुत अच्छा काम किया, मुझे Html.AttributeEncode सहायक का उपयोग करने की आवश्यकता थी। धन्यवाद DarkGray! – dwhite

4

मैं जानता हूँ कि इस खेल में देर हो चुकी है ... लेकिन, के लिए वर्तमान दृश्य में पारित सहायक समारोह। दृश्य से आपके पास एचटीएमएल और सहायक कार्यों तक पहुंच है।

6

App_Code में एक @helper इस ठीक से काम करने की जरूरत है:

// These are important for `Html.RouteLink` and such. 
@using System.Web.Mvc; 
@using System.Web.Mvc.Routing; 
@using System.Web.Mvc.Html; 
@using System.Web.Mvc.Razor; 

@helper SomeHelper() 
{ 
    // Get page and pull helper references from it. 
    var wvp = PageContext.Page as System.Web.Mvc.WebViewPage; 
    var Url = wvp.Url; // UrlHelper access 
    var Html = wvp.Html; // HtmlHelper access 
    var ViewBag = wvp.ViewBag; 
    // Helper code comes here... 
} 
2

एक और CodeAngry's answer पर ले, इस फ़ाइल में हर विधि के लिए सहायकों सक्षम बनाता है।

@using System.Web.Mvc; 
@using System.Web.Mvc.Html; 
@using System.Web.Mvc.Routing; 
@using System.Web.Mvc.Razor; 

@functions { 
    private static WebViewPage page { get { return PageContext.Page as WebViewPage; } } 
    private static System.Web.Mvc.HtmlHelper Html { get { return page.Html; } } 
    private static UrlHelper Url { get { return page.Url; } } 
    private static dynamic ViewBag { get { return page.ViewBag; } } 
} 
+0

ये कार्य एमवीसी 5.x (और शायद पहले) में आवश्यक नहीं हैं। ऐसा लगता है कि 'हेल्परपेज' बेस क्लास में अब पेज और एचटीएमएल गुण अंतर्निहित हैं, उदाहरण के लिए, आप सीधे अपने सहायक कोड में 'पेज.उआरएल' और' पेज। व्यूबैग 'का उपयोग कर सकते हैं। –

+0

क्या आप निश्चित हैं? मैं अभी भी नवीनतम एमवीसी पर एक ताजा परियोजना में इन सहायकों तक नहीं पहुंच सकता। शायद इंटेलिजेंस सिर्फ मुझे झूठ बोल रहा है;) – rbuddicom

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