2010-10-20 36 views
19

Tôi đang sử dụng chế độ xem Dao cạo với chế độ xem trước của asp mvc 3ASP MVC Razor xem phương pháp mở rộng, làm thế nào để tạo ra 'toàn cầu' phương pháp xem?

Tôi đang cố gắng tạo một số phương pháp mà tôi muốn có sẵn trực tiếp trong chế độ xem. Đây không phải là phương pháp trợ giúp thực sự Html vì vậy tôi không nghĩ rằng mở rộng HtmlHelper có ý nghĩa?

mục tiêu của tôi, có thể gọi các phương thức trong giao diện tức là

@HelloWorld(); vs @Html.HelloWorld() 

tôi có thể nhận Html.HelloWorld để làm việc bằng cách tạo ra một phương pháp mở rộng trên HtmlHelper

public static class HtmlExtensions 
{ 
    public static string HelloWorld(this HtmlHelper helper) 
    { 
     return "Hello"; 
    } 
} 

Tôi muốn làm điều tương tự nhưng đối với quan điểm; vấn đề của tôi - loại đối tượng nào là chế độ xem?

Lưu ý: tôi đã có thể có được điều này để làm việc bằng cách xác định các phương pháp trong trang .cshtml

@functions 
{ 
    public string HelloWorld() 
    { 
     return "Hello"; 
    } 
} 

@HelloWorld() @* now this works *@ 

sau đó tôi đã cố gắng để đặt mã này tập tin _viewstart.cshtml tôi nghĩ nó sẽ có sẵn trong tất cả các quan điểm nhưng nó đã không

nếu tôi biết loại quan điểm đã được tôi nghĩ rằng nó có thể dễ dàng mở rộng, bất kỳ sự giúp đỡ đánh giá cao

Trả lời

13

nó quay ra, thời gian chạy asp đang xảy ra để xác định phương pháp Execute khi chạy, do đó lớp cơ sở giao diện tùy chỉnh cũng phải trừu tượng

using System; 
using System.Web.Mvc; 

namespace MyMvcWebApp.Extensions 
{ 
    public abstract class ViewBase<TModel> 
     : System.Web.Mvc.WebViewPage<TModel> where TModel : class 
    { 
     // now this will be available in any view @HelloWorld() 
     public string HelloWorld() 
     { 
      return "Hello from the ViewBase class"; 
     } 
    } 
} 

này nên làm việc với quan điểm mạnh mẽ gõ, có vẻ như với dao cạo tất cả các chế độ xem được nhập mạnh mẽ, khi bạn không xác định loại 'động' được sử dụng và đó là loại mạnh

cũng như Clicktricity đã nói rồi cập nhật web.config (thư mục bên dưới thư mục Views)

<pages pageBaseType="MyMvcWebApp.Extensions.ViewBase"> 
+1

+1 . Đây là một giải pháp đẹp hơn nhiều so với việc viết một phương pháp mở rộng trên WebViewPage –

+6

Thực ra, tôi hoàn toàn không đồng ý với Noel Abrahams - đó là loại tình huống mà các phương pháp mở rộng được phát minh ra. Giải pháp được đưa ra ở trên có nghĩa là bạn có thay đổi cấu hình mà bạn sẽ cần thực hiện trong mọi ứng dụng web mà bạn muốn sử dụng. Ngoài ra, bằng cách sử dụng một phương pháp mở rộng làm cho nó là một 'kéo' sử dụng cho xem mà muốn sử dụng nó trong khi bằng cách thay đổi các lớp cơ sở lực lượng mỗi View để kế thừa rằng cho dù nó muốn hay không. –

1

các lớp cơ sở mặc định cho quan điểm Razor được quy định trong Web.config nằm trong thư mục quan điểm . Thông thường nó là:

<pages pageBaseType="System.Web.Mvc.WebViewPage"> 

Tôi đã không thử nó, nhưng tôi sẽ đề nghị kế thừa từ lớp cơ sở này và thêm chức năng riêng của bạn, sau đó điều chỉnh web.config cho phù hợp.

+1

Tôi đã thử điều này nhưng nhận được một lỗi biên dịch -> không triển khai thành phần trừu tượng kế thừa 'System.Web.WebPages.WebPageExecutingBase.Execute()'; Tôi cần nghiên cứu thêm; đoán rằng phương pháp đó thường được tạo ra trong thời gian chạy bởi asp.mvc? – house9

+2

Tôi nhận được 'WebViewPage phải được chuyển đổi sang System.Web.UI.Page' – Clark

+0

@Clark: Đó có thể là lỗi Resharper: http://youtrack.jetbrains.net/issue/RSRP-200244?query=namespace –

12

Như nhận xét của người khác, Razor Xem tất cả cuối cùng kế thừa từ WebViewPage:

public abstract class WebViewPage<TModel> : WebViewPage 

Do đó bạn có thể chỉ đơn giản là viết các phương pháp tiện ích để WebViewPage mà không cần tạo một lớp cơ sở mới hoặc thay đổi các tập tin cấu hình, mà đã được đề xuất bởi các câu trả lời khác. Ví dụ:

public static class WebViewPageExtensions 
{ 
    public static string HollowWorld(this WebViewPage wvp) 
    { 
     return "Memento mori"; 
    } 
} 

Thêm một tuyên bố sử dụng cho rằng không gian tên để xem bạn và sau đó:

<p>@this.HollowWorld()</p> 
+0

Nếu một số từ cộng đồng ASP.NET Core vấp vào chủ đề này, lớp mở rộng ở đây là: RazorPage thay vì WebViewPage. –

1

Cách tốt nhất để gọi một phương thức với các đối số sử dụng công cụ dao cạo là sử dụng người giúp đỡ. Ví dụ: cho phép bạn có người trợ giúp @MakeNote (nội dung chuỗi)

Sau đó, trong trang cshtml bạn chỉ cần gọi @MakeNote ("Xin chào") và bạn sẽ ổn.

Tôi đã phát điên khi tôi gặp sự cố khi Google gửi cho tôi trang này nhưng nó không giúp ích gì. Tôi đã cố gắng để tải nội dung trong html <select> với L2E sử dụng dao cạo.

Bí quyết là tạo người trợ giúp trong app_code rồi sử dụng với cshtml.

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