Làm thế nào để tạo một chức năng trong một mẫu cshtml?


219

Tôi cần tạo một hàm chỉ cần thiết trong một tệp cshtml. Bạn có thể nghĩ về tình huống của tôi như các phương thức trang ASP.NET, là các dịch vụ web tối thiểu được triển khai trong một trang, bởi vì chúng nằm trong một trang. Tôi biết về trình trợ giúp HTML (phương thức mở rộng), nhưng chức năng của tôi chỉ cần trong một tệp cshtml. Tôi không biết cách tạo chữ ký hàm trong chế độ xem. Lưu ý : Tôi đang sử dụng công cụ mẫu dao cạo.

Câu trả lời:


279

Bạn có thể sử dụng chỉ thị @rcper Razor:

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

Sau đó, bạn gọi nó như thế này:

@WelcomeMessage("John Smith")

13
Bạn không thể đặt các thẻ bên trong các @functionsphương thức, vì vậy tôi thích câu trả lời này.
jfren484

1
Vâng, điều này tốt hơn nhiều so với việc khai báo một hàm. Thẳng hơn nhiều về phía trước.
Muglio

2
Nhưng bạn không thể trả về các biến (do đó là hàm từ)
Paul

@Paul Tôi không hiểu ý của bạn là gì.
Daniel Liuzzi

2
Lõi asp.net cũng hỗ trợ @rcper?
MuM6oJuM6o

411

Tại sao không chỉ khai báo hàm đó bên trong tệp cshtml?

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

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

32
Điều này nên được đánh dấu là câu trả lời, vì chỉ thị @fifts đặc biệt đáp ứng các yêu cầu của OP. Tính năng Trợ giúp được dành cho sử dụng chung trên nhiều tệp mẫu bằng cách đặt tệp có chỉ thị @rcper vào thư mục App_Code. Trong khi đó, chỉ thị @fifts cho phép một chức năng chỉ được sử dụng bởi mẫu khai báo nó.
Jon Davis

7
Cũng lưu ý rằng những người trợ giúp dường như định hướng trả lại chuỗi giống như những người trợ giúp dao cạo khác đã làm, và do đó functionsgiải pháp cung cấp sự linh hoạt hơn cho các kiểu trả về. Cả hai câu trả lời đều được +1 trong cuốn sách của tôi vì cả hai đều là những thông tin hữu ích.
AaronLS

8
@AaronLS Để công bằng, những người trợ giúp không trả về chuỗi mà là IHtmlString, công ty sẽ chăm sóc mã hóa HTML cho bạn và bảo vệ ứng dụng của bạn khỏi các cuộc tấn công XSS. Người trợ giúp cũng cung cấp cho bạn sự tiện lợi của cú pháp Dao cạo trong chính trình trợ giúp mà bạn mất với các hàm. Nói cách khác, <p>Welcome, @username.</p>so với return new HtmlString("<p>Welcome, " + Html.Encode(username) + ".</p>");.
Daniel Liuzzi

9
Tuy nhiên, việc sử dụng @helpertrong một chế độ xem không làm cho nó có sẵn cho các chế độ xem khác. Lý do tôi thích @rcper hơn là bạn có thể đặt html giữa các dấu ngoặc nhọn của mình. @functionskhông (dễ dàng) cho phép bạn làm điều đó.
jfren484

5
Chỉ dành cho bản ghi: cả hai @helper@functionscó thể được chia sẻ giữa nhiều chế độ xem và cả hai có thể được khai báo và sử dụng bởi một chế độ xem (và cá nhân tôi đã tìm thấy việc sử dụng chúng cho cả hai kịch bản được chia sẻ / đơn lẻ). IMHO sự khác biệt thực tế duy nhất giữa chúng là thực tế là trình trợ giúp chế độ xem thêm đường cú pháp để trả về các đoạn mã HTML được hiển thị (hoặc, HelperResultví dụ phù hợp hơn ), trong khi chức năng xem thường chỉ hữu ích để trả về các loại tham chiếu hoặc giá trị đơn giản.
rsenna

25

Nếu phương thức của bạn không phải trả về html và phải làm một cái gì đó khác thì bạn có thể sử dụng lambda thay vì phương thức trợ giúp trong Dao cạo

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

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

<h2>Index</h2>

@Sum(3,4)

3
Nó hoạt động, nhưng nó xa sự đơn giản. Cuốn sách thánh của tôi là sự đơn giản;). Nhưng cảm ơn bạn đã cung cấp giải pháp thay thế.
Saeed Neamati

Mặc dù nó rất hữu ích nếu bạn cần truy cập các biến toàn cục của trang trong chức năng của mình, có cách nào khác để làm như vậy không? : /
Alexandre Daubricourt


1

Nếu bạn muốn truy cập các biến toàn cục của trang, bạn có thể làm như vậy:

@{
    ViewData["Title"] = "Home Page";

    var LoadingButtons = Model.ToDictionary(person => person, person => false);

    string GetLoadingState (string person) => LoadingButtons[person] ? "is-loading" : string.Empty;
}

Vì C # 7.0, đây là câu trả lời đúng và duy nhất. GetLoadingState()đây là chức năng địa phương.
Mèo Wolfrevo
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.