कैसे एक cshtml टेम्पलेट में एक समारोह बनाने के लिए?


219

मुझे एक फ़ंक्शन बनाने की ज़रूरत है जो केवल एक cshtml फ़ाइल के अंदर आवश्यक है। आप मेरी स्थिति को ASP.NET पृष्ठ विधियों के रूप में सोच सकते हैं, जो कि एक पृष्ठ में लागू की जाने वाली न्यूनतम वेब सेवाएँ हैं, क्योंकि वे एक पृष्ठ पर स्कैन की जाती हैं। मुझे HTML सहायकों (विस्तार विधियों) के बारे में पता है, लेकिन मेरे कार्य को केवल एक cshtml फ़ाइल में आवश्यक है। मुझे नहीं पता कि एक दृश्य के अंदर एक फ़ंक्शन हस्ताक्षर कैसे बनाया जाए। नोट : मैं रेजर टेम्पलेट इंजन का उपयोग कर रहा हूं।

जवाबों:


279

आप @ रेजर रेज़र निर्देश का उपयोग कर सकते हैं:

@helper WelcomeMessage(string username)
{
    <p>Welcome, @username.</p>
}

फिर आप इसे इस तरह से लागू करते हैं:

@WelcomeMessage("John Smith")

13
आप @functionsविधियों के अंदर टैग नहीं डाल सकते हैं , इसलिए मुझे यह उत्तर पसंद है।
jfren484

1
हाँ यह एक फ़ंक्शन घोषित करने से बहुत बेहतर है। बहुत अधिक सीधे आगे।
मुगलियो

2
लेकिन आप चर (इसलिए शब्द समारोह)
पॉल

@Paul मुझे समझ नहीं आ रहा है कि आपका क्या मतलब है।
डैनियल लियुज़ी

2
क्या asp.net core भी @helper का समर्थन करता है?
MuM6oJuM6o

411

क्यों नहीं cshtml फ़ाइल के अंदर उस फ़ंक्शन को घोषित करें?

@functions{
    public string GetSomeString(){
        return string.Empty;
    }
}

<h2>index</h2>
@GetSomeString()

32
इसे उत्तर के रूप में चिह्नित किया जाना चाहिए, क्योंकि @functions निर्देश विशेष रूप से ओपी आवश्यकताओं को पूरा करता है। हेल्पर्स फ़ीचर को ऐप्पल कोड निर्देशिका में @helper निर्देश के साथ फ़ाइल डालकर कई टेम्पलेट फ़ाइलों में साझा उपयोग के लिए अभिप्रेत है। जबकि, @functions निर्देश एक फ़ंक्शन को केवल उस टेम्पलेट द्वारा उपयोग करने की अनुमति देता है जो इसे घोषित करता है।
जॉन डेविस

7
यह भी ध्यान दें कि मदद करने वाले अन्य रेज़र सहायकों की तरह पहले से ही स्ट्रिंग्स को वापस करने के लिए उन्मुख लगते हैं, और इस तरह से यह functionsघोल रिटर्न प्रकारों के लिए अधिक लचीलापन प्रदान करता है। दोनों उत्तर मेरी किताब में +1 मिलते हैं, हालांकि वे दोनों जानकारी के उपयोगी टिडबिट हैं।
एरोनल्स

8
@AaronLS निष्पक्ष होने के लिए, मददगार स्ट्रिंग नहीं लौटाते हैं, लेकिन IHtmlString, जो आपके लिए HTML एन्कोडिंग का ध्यान रखते हैं और आपके ऐप को XSS हमलों से बचाते हैं। सहायक आपको सहायक में रेजर सिंटैक्स की सुविधा भी देते हैं, जिसे आप फ़ंक्शंस के साथ खो देते हैं। दूसरे शब्दों में, <p>Welcome, @username.</p>बनाम return new HtmlString("<p>Welcome, " + Html.Encode(username) + ".</p>");
डैनियल लियुज़ी

9
@helperएक दृश्य में उपयोग करने से यह अन्य विचारों को उपलब्ध नहीं होता है, हालांकि। कारण मुझे @helper बेहतर लगता है कि आप अपने घुंघराले ब्रेसिज़ के बीच html डाल सकते हैं @functions(आसानी से) आप ऐसा नहीं करते।
jfren484

5
बस रिकॉर्ड के लिए: दोनों @helperऔर @functionsकई विचारों के बीच साझा किया जा सकता है, और दोनों को एक ही दृश्य द्वारा घोषित और उपयोग किया जा सकता है (और मैंने व्यक्तिगत रूप से दोनों साझा / एकल परिदृश्यों में उनके लिए उपयोग पाया है)। IMHO उनके बीच एकमात्र व्यावहारिक अंतर यह है कि एक दृश्य सहायक, HTML स्निपेट (या, अधिक उपयुक्त, HelperResultउदाहरण) प्रदान करने के लिए वाक्यविन्यास चीनी जोड़ता है , जबकि एक दृश्य फ़ंक्शन आमतौर पर केवल साधारण संदर्भ या मूल्य प्रकारों को वापस करने के लिए उपयोगी होता है।
रासेन

25

अगर आपके तरीके को html को वापस नहीं करना है और कुछ और करना है तो आप रेजर में हेल्पर विधि के बजाय एक लैम्ब्डा का उपयोग कर सकते हैं

@{
    ViewBag.Title = "Index";
    Layout = "~/Views/Shared/_Layout.cshtml";

    Func<int,int,int> Sum = (a, b) => a + b;
}

<h2>Index</h2>

@Sum(3,4)

3
यह काम करता है, लेकिन यह सादगी से दूर है। मेरी पवित्र पुस्तक सरलता है;)। लेकिन विकल्प प्रदान करने के लिए धन्यवाद।
सईद नेमाटी

यह उपयोगी है हालांकि अगर आपको अपने फ़ंक्शन में पृष्ठ के वैश्विक चर तक पहुंचने की आवश्यकता है, तो क्या ऐसा करने का एक और तरीका है? : /
एलेक्जेंडर डेब्रॉकोर्ट


1

यदि आप अपने पृष्ठ के वैश्विक चर को एक्सेस करना चाहते हैं, तो आप ऐसा कर सकते हैं:

@{
    ViewData["Title"] = "Home Page";

    var LoadingButtons = Model.ToDictionary(person => person, person => false);

    string GetLoadingState (string person) => LoadingButtons[person] ? "is-loading" : string.Empty;
}

C # 7.0 के बाद से यह एकमात्र उचित और सही उत्तर है। GetLoadingState()यहाँ स्थानीय समारोह है।
वोल्फ्रेवो कैट्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.