2010-10-18 31 views
17

Tôi đang cố gắng có tất cả các lượt xem của mình được kế thừa từ lớp tùy chỉnh để tôi có thể thêm hành vi và giá trị nhất định cho tất cả các trang, nhưng tôi đang gặp một số vấn đề . Tôi đã thử subclassing System.Web.Mvc.WebViewPage nhưng tôi buộc phải thực hiện một thủ tục Execute mà tôi không biết những gì nó nên làm. Ngoài ra, nếu tôi cố gắng truy cập vào biến bối cảnh, tôi nhận được một tham chiếu null (thực sự lạ). Điều này khiến tôi nghĩ rằng tôi có thể có lớp cơ sở sai ....Lớp cơ sở của Chế độ xem dao cạo trong ASP.NET MVC3

Bất kỳ suy nghĩ nào?

+0

Bạn có thể thêm hành vi cho tất cả các lớp học của mình thông qua các phương pháp mở rộng hay bạn cần chúng để trở thành các phương pháp thể hiện? – R0MANARMY

+0

Chủ yếu tôi cần phải thêm một số biến có thể được tham chiếu từ bên trong các khung nhìn. Tôi biết tôi có thể đạt được điều này bằng cách sử dụng các phương pháp mở rộng, nhưng cần có một cách để có các lớp tùy chỉnh viewpage như với công cụ xem aspx. – Diego

Trả lời

30

Diego, System.Web.Mvc.WebViewPage là loại cơ sở phù hợp (và bạn nên có một lớp khác kế thừa từ System.Web.Mvc.WebViewPage<TModel> nếu bạn muốn có chế độ xem mạnh mẽ). Bạn nên đánh dấu lớp của riêng bạn là abstract để bạn không bị buộc phải triển khai phương thức Thực thi.

Cập nhật: Để định cấu hình tất cả chế độ xem của bạn để sử dụng lớp cơ sở tùy chỉnh, hãy xem tệp ~\Views\Web.config. Bên trong nó có một phần cụ thể Razor, nơi bạn có thể sử dụng thuộc tính pageBaseType để định cấu hình loại tùy chỉnh của mình.

Theo như thuộc tính Ngữ cảnh, nó phải được khởi tạo hoàn toàn sau khi chế độ xem đang thực thi. Tuy nhiên, nó có thể không có sẵn nếu bạn cố gắng truy cập nó quá sớm (ví dụ, từ constructor lớp của bạn). Khi nào bạn đang cố gắng truy cập nó?


Phương thức Execute là thứ được trình biên dịch Razor cung cấp khi chế độ xem của bạn được biên dịch. Ví dụ, với các tập tin xem sau

Hello @Name! 

Trình biên dịch Razor sẽ đằng sau hậu trường tạo ra các lớp sau (đây là một việc đơn giản hóa, vì vậy các chi tiết có thể được tắt, nhưng nó phải truyền đạt điểm)

public class _Some_Generated_Class_Name_ : System.Web.Mvc.WebViewPage { 
    public void Execute() { 
    Write("Hello "); 
    Write(Name); 
    Write("!"); 
    } 
} 

Sau đó, khung gọi phương thức Thực thi trên lớp chế độ xem của bạn và chế độ xem của bạn được thực thi.

+0

Trong constructor của lớp của tôi :) Đó phải là nó sau đó. – Diego

+0

Giống như phụ lục cho câu hỏi, thủ tục Thực thi phải làm gì? Có ổn không nếu tôi chỉ ghi đè nó bằng một quy trình trống? – Diego

+0

@Diego Tôi đã chỉnh sửa câu trả lời của mình để minh họa cách trình biên dịch tạo ra một triển khai thực hiện cho Execute. – marcind

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