2012-12-20 32 views
38

Trong khi nhìn vào một chủ đề tôi đã tải về từ thư viện Orchard CMS, tôi nhận thấy rằng một tập tin Layout.cshtml có khối mã này ở phía trên cùng của tập tin:Khối mã @functions trong tệp dao cạo làm gì và khi nào (nếu bao giờ) tôi nên sử dụng nó?

@functions { 
// To support the layout classifaction below. Implementing as a razor function because we can, could otherwise be a Func<string[], string, string> in the code block following. 
string CalcuClassify(string[] zoneNames, string classNamePrefix) 
{ 
    var zoneCounter = 0; 
    var zoneNumsFilled = string.Join("", zoneNames.Select(zoneName => { ++zoneCounter; return Model[zoneName] != null ? zoneCounter.ToString() : ""; }).ToArray()); 
    return HasText(zoneNumsFilled) ? classNamePrefix + zoneNumsFilled : ""; 
} 
} 

Tôi biết những gì các chức năng tuyên bố thực hiện (tính toán các vùng nào được điền để trả về chiều rộng của mỗi cột), câu hỏi của tôi là - việc sử dụng đúng khối @function là gì và khi nào tôi nên sử dụng nó?

+0

Cá nhân tôi nghĩ rằng nó nên tránh vì nó chỉ bùn nước trong những gì là bạn trình bày/xem lớp và bộ điều khiển/lớp kinh doanh của bạn là gì. – Liam

+12

@Liam - Tôi không đồng ý. Tôi nghĩ rằng nó nên được sử dụng rõ ràng cho mục đích của * tránh * bùn nước. Trong ví dụ này, nó nhằm mục đích xác định chiều rộng cột, mà không phải là điều mà bộ điều khiển thậm chí còn biết. – Bobson

+1

@bobson point – Liam

Trả lời

52

Khối @functions cho phép bạn xác định các chức năng tiện ích trực tiếp trong chế độ xem, thay vì thêm chúng dưới dạng tiện ích mở rộng cho trình trợ giúp @Html hoặc cho phép trình điều khiển biết về các thuộc tính hiển thị. Bạn muốn sử dụng nó khi bạn có thể đáp ứng các điều kiện sau:

  1. Chức năng này được gắn chặt với chế độ xem và thường không hữu ích ở nơi khác (chẳng hạn như "Tôi tạo cột của mình rộng bao nhiêu").
  2. Chức năng này nhiều hơn một câu lệnh đơn giản là if và/hoặc được sử dụng ở nhiều vị trí trong chế độ xem của bạn.
  3. Mọi thứ mà hàm cần xác định logic của nó đã tồn tại trong Model cho chế độ xem.

Nếu bạn thất bại lần đầu tiên, hãy thêm nó làm trình trợ giúp @Html.

Nếu bạn không làm điều thứ hai, chỉ cần in nội tuyến.

Nếu bạn thất bại lần thứ ba, bạn nên thực hiện phép tính trong bộ điều khiển và chuyển kết quả như là một phần của mô hình.

+0

+1. Đây là một câu trả lời tuyệt vời. Có một trường hợp khi sử dụng '@ functions', nhưng không phải thường xuyên! –

+1

Câu trả lời hay, đặc biệt là phần giải thích các giải pháp thay thế bạn nên sử dụng: D –

+0

Câu trả lời hay, cảm ơn –

0

Từ msdn blogs, @functions khối là để cho bạn quấn lên mã tái sử dụng, giống như các phương pháp và tính

0

Trong trường hợp đặc biệt này, những người đã tạo ra các chủ đề bạn đang sử dụng có lẽ đã cố gắng để giữ nó như là một chủ đề đơn giản (chỉ xem, css và hình ảnh).

Nếu bạn cần viết một số mã cho chủ đề cho Orchard, bạn phải chuyển sang mô-đun (như đã nêu ở đây: http://docs.orchardproject.net/Documentation/Anatomy-of-a-theme) trừ khi bạn viết mã này trong chế độ xem.

Tôi không chắc là nó đáng để chuyển từ một chủ đề sang mô-đun chỉ để lấy kích thước của một cột.

6

Những người khác đã giải thích những gì @functions làm như vậy tôi sẽ không phục hồi lại điều đó. Nhưng tôi muốn thêm điều này:

Nếu chế độ xem của bạn được nhập vào chế độ xem, tôi cho rằng tùy chọn khả thi sẽ chuyển logic này vào chế độ xem để tránh làm lộn xộn đánh dấu của bạn bằng quá nhiều mã. Nếu không, quan điểm của bạn bắt đầu trông giống như ASP cổ điển và tôi không nghĩ ai muốn điều đó.

Tôi không nghĩ có điều gì sai khi sử dụng @functions hoặc @helper trong chế độ xem của bạn, nhưng một khi bạn vượt quá một vài phương pháp trong chế độ xem của mình hoặc thậm chí nếu chức năng hơi phức tạp, có thể tái cấu trúc giá trị viewmodel nếu có thể. Nếu đó là mã có thể được tái sử dụng, có thể là một ý tưởng tốt để kéo nó ra thành một lớp trợ giúp hoặc một phần mở rộng cho lớp HtmlHelper. Một điều đó là một bummer là nhận ra bạn chỉ viết lại một đoạn mã đã tồn tại bởi vì bạn không biết nó đã được ẩn đi trong một số xem tùy ý.

Các vấn đề liên quan