Bir cshtml şablonunda bir işlev nasıl oluşturulur?


219

Sadece bir cshtml dosyası içinde gerekli olan bir işlev oluşturmak gerekiyor. Durumumu, bir sayfaya uygulandıkları için bir sayfada uygulanan min. Web hizmetleri olan ASP.NET sayfa yöntemleri olarak düşünebilirsiniz. HTML yardımcıları (uzantı yöntemleri) hakkında biliyorum, ama benim fonksiyonum sadece bir cshtml dosyasında gereklidir. Bir görünüm içinde nasıl işlev imzası oluşturulacağını bilmiyorum. Not : Razor şablon motorunu kullanıyorum.

Yanıtlar:


279

@Helper Razor yönergesini kullanabilirsiniz:

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

Sonra şöyle çağırıyorsunuz:

@WelcomeMessage("John Smith")

13
Etiketleri @functionsyöntemlerin içine koyamazsınız , bu yüzden bu yanıtı beğendim.
jfren484

1
Evet, bu bir işlevi bildirmekten çok daha iyi. Çok daha düz.
muglio

2
Ancak değişkenleri döndüremezsiniz (dolayısıyla işlev işlevi)
Paul

@ Paul Onunla ne demek istediğini anlamıyorum.
Daniel Liuzzi

2
Asp.net core @helper'ı da destekliyor mu?
MuM6oJuM6o

411

neden sadece cshtml dosyasındaki bu işlevi bildirmiyorsunuz?

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

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

32
@Functions yönergesi özellikle OP gereksinimlerini karşıladığından, yanıt olarak işaretlenmelidir. Helpers özelliği, @helper yönergesi olan dosyayı bir App_Code dizinine koyarak birden çok şablon dosyasında paylaşılan kullanım için tasarlanmıştır. Oysa @functions yönergesi bir işlevin yalnızca onu bildiren şablon tarafından kullanılmasına izin verir.
Jon Davis

7
Ayrıca yardımcıların, diğer traş makinesi yardımcılarının yaptığı gibi dönen tellere yöneldiğini ve bu nedenle functionsçözümün eski dönüş tipleri için daha fazla esneklik sağladığını unutmayın. Her iki cevap da kitapta +1 alır, çünkü ikisi de yararlı bilgilerdir.
AaronLS

8
@AaronLS Adil olmak gerekirse, yardımcılar dizeleri değil, sizin için HTML kodlamasıyla ilgilenen ve uygulamanızı XSS ​​saldırılarına karşı koruyan IHtmlString'i döndürür. Yardımcılar ayrıca, fonksiyonlarla kaybettiğiniz yardımcıların kendisinde Razor sözdiziminin rahatlığını sağlar. Başka bir deyişle, <p>Welcome, @username.</p>karşı return new HtmlString("<p>Welcome, " + Html.Encode(username) + ".</p>");.
Daniel Liuzzi

9
@helperyine de tek bir görünümde kullanmak onu diğer görünümler için kullanılabilir yapmaz. @helper'ı daha iyi sevmemin nedeni kıvırcık kaşlarınız arasında html koyabilirsiniz. @functions(kolayca) bunu yapmana izin vermiyor.
jfren484

5
Sadece kayıt için: her ikisi de @helperve @functionsbirçok görünüm arasında paylaşılabilir ve her ikisi de tek bir görünümde bildirilebilir ve kullanılabilir (ve kişisel olarak her iki paylaşılan / tek senaryoda onlar için kullanım buldum). IMHO, aralarındaki tek pratik fark, bir görünüm yardımcısının, oluşturulan HTML snippet'lerini (veya daha uygun HelperResultörnekleri) döndürmek için sözdizimsel şeker eklemesidir , ancak bir görünüm işlevi genellikle yalnızca basit başvuru veya değer türlerini döndürmek için yararlıdır.
rsenna

25

Yönteminiz html döndürmek zorunda değilse ve başka bir şey yapmak zorundaysa, Razor'da yardımcı yöntem yerine lambda kullanabilirsiniz

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

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

<h2>Index</h2>

@Sum(3,4)

3
İşe yarıyor, ama basitlikten uzak. Kutsal kitabım basitlik;). Ancak alternatif sunduğunuz için teşekkür ederiz.
Saeed Neamati

Sayfanızın global değişkenlerine işlevinizde erişmeniz gerekiyorsa, bunun başka bir yolu var mı? : /
Alexandre Daubricourt


1

Sayfanızın genel değişkenlerine erişmek istiyorsanız, bunu yapabilirsiniz:

@{
    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'dan beri bu tek doğru ve doğru cevaptır. GetLoadingState()İşte yerel işlev.
Wolfrevo Cats
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.