Razor'da bir yöntemi nasıl tanımlayabilirim?


Yanıtlar:


310

Ne zaman (eğer varsa) yapılması gereken tartışmaları tek başına bırakarak, @fonksiyonlar bunu nasıl yaptığınızdır.

@functions {

    // Add code here.

}

16
+1 teşekkürler, FYI denir pratiklik. MVC şehirdeki tek oyun değil. Sadece MVC gibi basit ustura ve URLRewrite gibi bazı millet IMO küçük yararına yapacak çok olduğu
Jason Sebring

5
@functionsorganize etmek iyi bir yerdir görünümü özgü nesil kodu. Durumda: bu çirkin istemci şablonları-dizeleri ..
user2864740

1
merhaba David, işlevi bir dosyada nasıl tanımlayabilir ve başka bir dosyada nasıl kullanabilirim?
Georgi Kovachev

Georgi, buna "Razor HTML Helper" deniyor. Temel olarak, Kod klasörünüzde tanımlanan ve burada önerildiği gibi bir dizi statik yöntem içeren bir sınıf: asp.net/mvc/overview/older-versions-1/views/…
jeanie77

Georgi, bunu şimdiye kadar görmüş olabilirsiniz ... ancak <code> @functions </code> veya <code> @helper </code> Jilet seçeneklerini yeniden kullanmak için App_Code'unuzdaki Shared.cshtml gibi bir dosya kullanabilirsiniz Klasör. Burada <code> @functions {} </code> veya <code> @helper MyFunction () {} </code> tanımlayabilir ve bunları <code> @ Shared.MyFunction () <gibi diğer Razor şablonlarınızda kullanabilirsiniz. / code> dosyasının adı "ad alanı" gibidir
Jamie Altizer

194

Satır içi yardımcı mı demek istediniz?

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

@SayHello("John")

4
MvcHtmlString değil, bir C # türü döndüren bir yöntem tanımlamak istiyorum.
Rookian

4
@Rookian, neden bir görünümde C # kodu yazmanız gerekiyor? Yani bir bakışta yazma yöntemleri yanlış! C # kodunuzu nerede olursanız olun mükemmel bir şekilde yazabilir ve daha sonra yöntemi bir Razor görünümünde çağırabilirsiniz ve HTML yardımcılarının yaptığı tam olarak budur. Ve her zaman bir MvcHtmlString döndürmeleri gerekmez.
Darin Dimitrov

1
@Rookian, belki ilk etapta ne yapmaya çalıştığınızı açıklayabilirsiniz. Ne olursa olsun bir görünümde C # kodu yazmak yerine bunu yapmak için daha iyi bir yol olduğundan eminim :-)
Darin Dimitrov

1
Bu harika! Teşekkür ederim Darin ... MVC ile ilgili her şeyi bildiğimi düşündüğümde, sen gel ve yeni bir şey öğreniyorum :)
Serj Sagan

3
ASP.NET Core eşdeğeri Etiket Yardımcısıdır: docs.microsoft.com/en-us/aspnet/core/mvc/views/tag-helpers/…
beercohol

34

Jilet içinde bir fonksiyon tanımlamak çok basit.

@functions {

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

Böylece herhangi bir yerde bir işlevi çağırabilirsiniz. Sevmek

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

Ancak, aynı çalışma da yapılabilir helper. Örnek olarak

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

Peki fark nedir ?? Bu önceki göre yazı hem @helpers ve @functions ortak olan hisse bir şey yapmak - onlar Web Sayfaları dahilinde bir ihtimal yeniden kod olun. Ortak bir şey daha paylaşıyorlar - ilk bakışta aynı görünüyorlar, bu da rolleri hakkında biraz karışıklığa neden olabilir. Ancak, aynı değiller. Temel olarak, bir yardımcı yöntem olarak kullanılan Razor sytnax'ın yeniden kullanılabilir bir snippetidir ve tarayıcıya HTML oluşturmak için tasarlanmıştır, bir işlev Web Sayfaları uygulamanızın herhangi bir yerinden çağrılabilen statik yardımcı yöntemdir. Bir yardımcı için dönüş türü her zaman HelperResult olurken, bir işlevin dönüş türü olmasını istediğiniz her şeydir.


2
.Netcore'da benim için çalışıyor @Functionsgibi öneki atlayarak işlevi @OrderedList(...)çağırıyor.
Muflix

12

Bunu böyle bir Func ile de yapabilirsiniz

@{
    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

Jilet sadece cazip bir motordur.

Normal bir sınıf oluşturmalısınız.

Ustura sayfasının içinde bir yöntem yapmak istiyorsanız, bunları bir @functionsbloğa koyun .


1

Bunları bir jilet bloğunda (yani ) yerel işlevler olarak bildirebilirsiniz @{}.

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

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

0

Ayrıca @{ }bloğu işlevler oluşturmak için de kullanabilirsiniz :

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

Sonra ustura sayfanızda:

   <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>
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.