मैं रेजर में एक विधि को कैसे परिभाषित करूं?


213

मैं रेजर में एक विधि को कैसे परिभाषित करूं?


1
उन लोगों के लिए जो यह देखना चाहते थे कि विकल्प क्या हैं: इसे करने के दो तरीके हैं। एक। "@ फंक्शन" का उपयोग करके और "@ हेल्पर" का उपयोग करके। उनके बीच के अंतर को अच्छी तरह से यहाँ समझाया गया है। mikesdotnetting.com/article/173/…
b1k

जवाबों:


310

जब (यदि कभी हो) पर किसी भी बहस को छोड़कर, यह किया जाना चाहिए, @functions यह है कि आप इसे कैसे करते हैं।

@functions {

    // Add code here.

}

16
+1 धन्यवाद, FYI इसकी व्यावहारिकता कहलाता है। MVC शहर में एकमात्र गेम नहीं है। कुछ लोग सिर्फ़ रेजर और URLRewrite को पसंद करते हैं, जैसे MVC, थोड़ा लाभ IMO के लिए बहुत कुछ करता है
जेसन सेब्रिंग

5
@functionsदृश्य विशिष्ट पीढ़ी कोड को व्यवस्थित करने के लिए एक अच्छी जगह है । बिंदु में मामला: उन बदसूरत ग्राहक टेम्पलेट्स-से-तार ..
user2864740

1
हाय डेविड, मैं एक फ़ाइल में फ़ंक्शन को कैसे परिभाषित कर सकता हूं और इसे किसी अन्य फ़ाइल में उपयोग कर सकता हूं?
जॉर्जी कोवाचेव

जॉर्जी, इसे "रेज़र एचटीएमएल हेल्पर" कहा जाता है। मूल रूप से, आपके कोड फ़ोल्डर में एक वर्ग परिभाषित किया गया है, यहाँ सुझाए गए स्थिर तरीकों के एक सेट के साथ: asp.net/mvc/overview/older-versions-1/views/…
jeanie77

जॉर्जी, अब तक आप इस पर आ गए होंगे ... लेकिन पुन: उपयोग करने के लिए <code> @functions </ code> या <code> @helper </ code> रेजर विकल्प आप अपने App_Code में Shared.cshtml जैसी फ़ाइल का उपयोग कर सकते हैं फ़ोल्डर। वहाँ आप <code> @functions {} </ code> या <code> @helper MyFunction () {} </ code> को परिभाषित कर सकते हैं और उन्हें अपने अन्य रेज़र टेम्पलेट्स में उपयोग कर सकते हैं जैसे <code> @ Shared.MyFunction () < / कोड> जहाँ फ़ाइल का नाम "नेमस्पेस" जैसा है
जेमी अल्टाइज़र

194

आपका मतलब इनलाइन हेल्पर से है?

@helper SayHello(string name)
{
    <div>Hello @name</div>
}

@SayHello("John")

4
मैं एक ऐसी विधि को परिभाषित करना चाहता हूं जो MvcHtmlString नहीं, बल्कि C # प्रकार देता है।
रूकियन

4
@Rookian, आपको कभी किसी दृश्य में C # कोड लिखने की आवश्यकता क्यों होगी? मेरा मतलब है कि एक दृश्य में लिखने के तरीके सिर्फ गलत हैं! आप अपने C # कोड को पूरी तरह से ठीक से लिख सकते हैं जहाँ भी संबंधित है और फिर रेजर दृश्य में विधि को लागू करते हैं, और यही HTML सहायकों के लिए ठीक है। और वे हमेशा एक MvcHtmlString नहीं लौटते हैं।
डैरिन दिमित्रोव

1
@ रूकिए, शायद आप समझा सकते हैं कि आप पहली बार में क्या करने की कोशिश कर रहे हैं। जो भी हो मुझे यकीन है कि सी # कोड को एक दृश्य में लिखने के बजाय इसे करने का एक बेहतर तरीका है :-)
डारिन दिमित्रोव

1
यह कमाल का है! धन्यवाद डारिन ... बस जब मुझे लगता है कि मुझे एमवीसी के बारे में सब कुछ पता है, तो आप साथ आते हैं और मैं कुछ नया सीखता हूं :)
सर्ज सगन

3
ASP.NET कोर समतुल्य है टैग हेल्पर: docs.microsoft.com/en-us/aspnet/core/mvc/views/tag-helpers/…
बीयरचेन

34

रेजर के अंदर एक फ़ंक्शन को परिभाषित करना बहुत सरल है।

@functions {

    public static HtmlString OrderedList(IEnumerable<string> items)
    { }
}

तो आप फ़ंक्शन को कहीं भी कॉल कर सकते हैं। पसंद

@Functions.OrderedList(new[] { "Blue", "Red", "Green" })

हालांकि, यह एक ही काम के माध्यम से helperभी किया जा सकता है । उदहारण के लिए

@helper OrderedList(IEnumerable<string> items){
    <ol>
        @foreach(var item in items){
            <li>@item</li>
        }
    </ol>
}

तो अंतर क्या है?? इस पिछली पोस्ट के अनुसार @helpers और @functions दोनों एक ही बात को आम तौर पर साझा करते हैं - वे वेब पेज के भीतर कोड का पुन: उपयोग करने की संभावना बनाते हैं। वे आम तौर पर एक और बात भी साझा करते हैं - वे पहली नज़र में समान दिखते हैं, जो कि उनकी भूमिकाओं के बारे में थोड़ा भ्रम पैदा कर सकता है। हालांकि, वे समान नहीं हैं। संक्षेप में, एक सहायक एक विधि के रूप में उजागर रेज़र साइटैक्स का पुन: प्रयोज्य स्निपेट है, और ब्राउज़र के लिए HTML प्रदान करने के लिए अभिप्रेत है, जबकि एक फ़ंक्शन स्थिर उपयोगिता विधि है जिसे आपके वेब पेज एप्लिकेशन के भीतर कहीं से भी कॉल किया जा सकता है। हेल्पर के लिए रिटर्न प्रकार हमेशा हेल्परइस्कूल होता है, जबकि एक फ़ंक्शन के लिए रिटर्न प्रकार जो भी आप चाहते हैं वह है।


2
.Netcore में मेरे लिए काम के @Functionsरूप में उपसर्ग को छोड़ कर फ़ंक्शन को कॉल करना @OrderedList(...)
मुफ्लिक्स

12

आप इसे फंक के साथ भी कर सकते हैं

@{
    var getStyle = new Func<int, int, string>((width, margin) => string.Format("width: {0}px; margin: {1}px;", width, margin));
}

<div style="@getStyle(50, 2)"></div>

10

रेजर सिर्फ एक अस्थायी इंजन है।

आपको एक नियमित वर्ग बनाना चाहिए।

यदि आप रेजर पेज के अंदर एक विधि बनाना चाहते हैं, तो उन्हें एक @functionsब्लॉक में रखें


1

आप उन्हें रेजर ब्लॉक (यानी ) में स्थानीय कार्यों के रूप में घोषित कर सकते हैं @{}

@{
    int Add(int x, int y)
    {
        return x + y;
    }
}

<div class="container">
    <p>
        @Add(2, 5)
    </p>
</div>

0

आप केवल @{ }फ़ंक्शन बनाने के लिए ब्लॉक का उपयोग कर सकते हैं :

@{
    async Task<string> MyAsyncString(string input)
    {
        return Task.FromResult(input);
    }
}

फिर बाद में अपने रेजर पेज में:

   <div>@(await MyAsyncString("weee").ConfigureAwait(false))</div>

0

MyModelVm.cs

public class MyModelVm
{
    public HttpStatusCode StatusCode { get; set; }
}

Index.cshtml

@model MyNamespace.MyModelVm
@functions
{
    string GetErrorMessage()
    {
        var isNotFound = Model.StatusCode == HttpStatusCode.NotFound;
        string errorMessage;
        if (isNotFound)
        {
            errorMessage = Resources.NotFoundMessage;
        }
        else
        {
            errorMessage = Resources.GeneralErrorMessage
        }

        return errorMessage;
    }
}

<div>
    @GetErrorMessage()
</div>
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.