Bagaimana cara menentukan metode dalam Razor?


Jawaban:


310

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

@functions {

    // Add code here.

}

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")

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.


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>

10

Razor hanyalah mesin templating.

Anda harus membuat kelas reguler.

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


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>

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>

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>
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.