Làm cách nào để xác định phương thức trong Dao cạo?


213

Làm cách nào để xác định phương thức trong Dao cạo?


1
Đối với những người muốn xem các tùy chọn là gì: Có hai cách để làm điều đó. Một. sử dụng "@factor" và một cái khác sử dụng "@rcper". Sự khác biệt giữa chúng được giải thích độc đáo ở đây. mikedotnetting.com/article/173/ Mạnh
b1k

Câu trả lời:


310

Để lại một mình bất kỳ cuộc tranh luận nào khi (nếu có) nó nên được thực hiện, @fifts là cách bạn làm điều đó.

@functions {

    // Add code here.

}

16
+1 cảm ơn, FYI được gọi là thực tiễn. MVC không phải là trò chơi duy nhất trong thị trấn. Một số người chỉ thích dao cạo đơn giản và URLRewrite như MVC rất nhiều việc phải làm vì lợi ích nhỏ IMO
Jason Sebring

5
@functionslà một nơi tốt để tổ chức xem mã thế hệ cụ thể . Trường hợp cụ thể: những mẫu máy khách xấu xí đó - từ chuỗi ..
user2864740

1
chào David, làm thế nào tôi có thể xác định chức năng trong một tệp và sử dụng nó trong một tệp khác?
Georgi Kovachev

Georgi, đây được gọi là "Trình trợ giúp HTML HTML". Về cơ bản, một lớp được định nghĩa trong thư mục Mã của bạn, với một tập hợp các phương pháp tĩnh như đề xuất ở đây: asp.net/mvc/overview/older-versions-1/views/...
jeanie77

Georgi, bây giờ bạn có thể bắt gặp điều này ... nhưng để sử dụng lại <code> @fifts </ code> hoặc <code> @helper </ code> Bạn có thể sử dụng một tệp như Shared.cshtml trong App_Code của mình thư mục. Trong đó, bạn có thể xác định <code> @fifts {} </ code> hoặc <code> @helper MyFactor () {} </ code> và sử dụng chúng trong các mẫu Dao cạo khác của bạn như <code> @ Shared.MyFunction () < / code> trong đó tên của tệp giống như "không gian tên"
Jamie Altizer

194

Bạn có nghĩa là người trợ giúp nội tuyến?

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

@SayHello("John")

4
Tôi muốn xác định một phương thức trả về không phải là MvcHtmlString, mà là kiểu C #.
Rookian

4
@Rookian, tại sao bạn cần viết mã C # trong chế độ xem? Tôi có nghĩa là phương pháp viết trong một quan điểm là sai! Bạn hoàn toàn có thể viết mã C # của mình bất cứ nơi nào thuộc về và sau đó gọi phương thức trong chế độ xem Dao cạo, và đó chính xác là những gì người trợ giúp HTML làm. Và họ không được phép trả lại luôn một MvcHtmlString.
Darin Dimitrov

1
@Rookian, có lẽ bạn có thể giải thích những gì bạn đang cố gắng làm ở nơi đầu tiên. Dù đó là gì thì tôi chắc chắn có một cách tốt hơn để làm điều đó hơn là viết mã C # trong một khung nhìn :-)
Darin Dimitrov

1
Điều này thật tuyệt! Cảm ơn Darin ... ngay khi tôi nghĩ tôi biết mọi thứ về MVC, bạn đã đến và tôi học được điều gì đó mới :)
Serj Sagan

3
Tương đương với ASP.NET Core là Trình trợ giúp thẻ: docs.microsoft.com/en-us/aspnet/core/mvc/view/tag-helpers/ Kẻ
beercohol

34

Rất đơn giản để xác định một chức năng bên trong dao cạo.

@functions {

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

Vì vậy, bạn có thể gọi một chức năng bất cứ nơi nào. Giống

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

Tuy nhiên, công việc này cũng có thể được thực hiện thông qua helperquá. Làm ví dụ

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

Vì vậy, sự khác biệt là gì?? Theo bài đăng trước đây, cả @helpers và @fifts đều chia sẻ một điểm chung - họ làm cho mã sử dụng lại một khả năng trong các Trang web. Họ cũng chia sẻ một điểm chung khác - thoạt nhìn họ giống nhau, đó là điều có thể gây ra một chút nhầm lẫn về vai trò của họ. Tuy nhiên, chúng không giống nhau. Về bản chất, một trình trợ giúp là một đoạn mã có thể tái sử dụng của sytnax được hiển thị dưới dạng phương thức và được dùng để hiển thị HTML cho trình duyệt, trong khi đó một chức năng là phương thức tiện ích tĩnh có thể được gọi từ bất kỳ đâu trong ứng dụng Trang web của bạn. Kiểu trả về cho người trợ giúp luôn là HelperResult, trong khi kiểu trả về cho hàm là bất cứ điều gì bạn muốn.


2
Gọi hàm bằng cách bỏ @Functionstiền tố làm @OrderedList(...)việc cho tôi trong .netcore.
Muflix

12

Bạn cũng có thể làm điều đó với một Func như thế này

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

Dao cạo chỉ là một động cơ templating.

Bạn nên tạo một lớp học bình thường.

Nếu bạn muốn tạo một phương thức bên trong trang Dao cạo, hãy đặt chúng vào một @functionskhối .


1

Bạn có thể chỉ cần khai báo chúng là các hàm cục bộ trong một khối dao cạo (tức là @{}).

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

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

0

Bạn cũng có thể chỉ sử dụng @{ }khối để tạo chức năng:

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

Sau đó, trong trang dao cạo của bạn:

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