Bagaimana cara menentukan metode dalam Razor?

213

Bagaimana cara menentukan metode dalam Razor?

Rookian
sumber
1
Bagi mereka yang ingin melihat opsi apa saja: Ada dua cara untuk melakukannya. Satu. menggunakan "@fungsi" dan lainnya menggunakan "@helper". Perbedaan di antara mereka dijelaskan dengan baik di sini. mikesdotnetting.com/article/173/…
b1k

Jawaban:

310

Meninggalkan sendiri segala perdebatan tentang kapan (jika pernah) itu harus dilakukan, @functions adalah bagaimana Anda melakukannya.

@functions {

    // Add code here.

}
David Ruttka
sumber
16
+1 terima kasih, FYI disebut kepraktisannya. MVC bukan satu-satunya game di kota. Beberapa orang hanya menyukai pisau cukur sederhana dan URLRewrite karena MVC banyak yang harus dilakukan untuk sedikit manfaat IMO
Jason Sebring
5
@functionsadalah tempat yang baik untuk mengatur tampilan kode generasi tertentu . Contoh kasus: templates-from-string klien jelek itu
user2864740
1
hai David, bagaimana saya bisa mendefinisikan fungsi dalam satu file dan menggunakannya dalam file lain?
Georgi Kovachev
Georgi, ini disebut "Razor HTML Helper". Pada dasarnya, kelas didefinisikan dalam folder Kode Anda, dengan serangkaian metode statis seperti yang disarankan di sini: asp.net/mvc/overview/older-versions-1/views/…
jeanie77
Georgi, Anda mungkin sudah menemukan ini sekarang ... tetapi untuk menggunakan kembali <code> @functions </code> atau <code> @helper </code> Opsi silet Anda dapat menggunakan file seperti Shared.cshtml di App_Code Anda map. Di sana Anda dapat menentukan <code> @functions {} </code> atau <code> @helper MyFunction () {} </code> dan menggunakannya di templat Razor Anda yang lain seperti <code> @ Shared.MyFunction () < / code> di mana nama file seperti "namespace"
Jamie Altizer
194

Maksudmu inline helper?

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

@SayHello("John")
Darin Dimitrov
sumber
4
Saya ingin mendefinisikan metode yang mengembalikan bukan MvcHtmlString, tetapi tipe C #.
Rookian
4
@Rookian, mengapa Anda harus menulis kode C # dalam tampilan? Maksud saya menulis metode dalam tampilan itu salah! Anda dapat dengan baik menulis kode C # di mana saja di milik dan kemudian memanggil metode dalam tampilan Razor, dan itulah yang dilakukan oleh pembantu HTML. Dan mereka tidak seharusnya selalu mengembalikan MvcHtmlString.
Darin Dimitrov
1
@Rookian, mungkin Anda bisa menjelaskan apa yang Anda coba lakukan sejak awal. Apa pun itu, saya yakin ada cara yang lebih baik untuk melakukannya daripada menulis kode C # dalam tampilan :-)
Darin Dimitrov
1
Ini luar biasa! Terima kasih Darin ... tepat ketika saya pikir saya tahu segalanya tentang MVC, Anda datang dan saya belajar sesuatu yang baru :)
Serj Sagan
3
Setara dengan ASP.NET Core adalah Tag Helper: docs.microsoft.com/en-us/aspnet/core/mvc/views/tag-helpers/…
beercohol
34

Sangat sederhana untuk mendefinisikan fungsi di dalam silet.

@functions {

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

Jadi, Anda dapat memanggil fungsi di mana saja. Suka

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

Namun, pekerjaan yang sama juga bisa dilakukan helper. Sebagai contoh

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

Jadi apa bedanya ?? Menurut posting sebelumnya ini @helpers dan @functions berbagi satu hal yang sama - mereka membuat kode menggunakan kembali kemungkinan di dalam Halaman Web. Mereka juga berbagi kesamaan - mereka terlihat sama pada pandangan pertama, yang mungkin menyebabkan sedikit kebingungan tentang peran mereka. Namun, keduanya tidak sama. Intinya, helper adalah cuplikan Razt sytnax yang dapat digunakan kembali sebagai metode, dan dimaksudkan untuk merender HTML ke browser, sedangkan fungsi adalah metode utilitas statis yang dapat dipanggil dari mana saja dalam aplikasi Halaman Web Anda. Tipe pengembalian untuk helper selalu HelperResult, sedangkan tipe kembali untuk fungsi adalah apa pun yang Anda inginkan.

gdmanandamohon
sumber
2
Memanggil fungsi dengan menghilangkan @Functionsawalan sebagai @OrderedList(...)berfungsi untuk saya di .netcore.
Muflix
12

Anda juga bisa melakukannya dengan Fungsi seperti ini

@{
    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>
Bokoskokos
sumber
10

Razor hanyalah mesin templating.

Anda harus membuat kelas reguler.

Jika Anda ingin membuat metode di dalam halaman Razor, letakkan di @functionsblokir .

Slaks
sumber
1

Anda cukup mendeklarasikannya sebagai fungsi lokal di blok silet (yaitu @{}).

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

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

Anda juga bisa menggunakan @{ }blokir untuk membuat fungsi:

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

Kemudian di halaman pisau cukur Anda:

   <div>@(await MyAsyncString("weee").ConfigureAwait(false))</div>
Daniel
sumber
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>
Joel Wiklund
sumber