2012-03-26 41 views
13

Tại sao biến số scriptPathngoài phạm vi ở cuối mã?Phạm vi biến trong trang aspx

Nó có nằm trong phạm vi toàn bộ trang này không? Trong MVC, nếu tôi đánh dấu phần này ở đầu trang như

@{ 
    string scriptPath = "assets/scripts/", 
      gkoConfig = "GkoConfig.js"; 
} 

nó có sẵn trong Chế độ xem hiện tại. Tôi đang bỏ lỡ điều gì khi trở lại WebForms một thời gian?

enter image description here

Nếu tôi thay đổi vị trí mã, Nó lấy của kì quặc như bên trong <head> tôi không còn có thể truy cập teh biến, nhưng tôi có, bên trong <body> bây giờ ...: -/

enter image description here

Trả lời

13

Khi bạn khai báo biến trong tệp .aspx của Biểu mẫu web, bạn thực sự đang khai báo biến cục bộ bên trong phương thức hiển thị được tạo tự động. ASP.NET tạo ra các phương thức kết xuất riêng cho tất cả các thẻ được đánh dấu là runat="server", vì vậy bạn thực sự có một phương thức riêng cho phần tử đầu của bạn. Bây giờ, biến mà bạn khai báo chỉ có thể tồn tại trong một trong các phương thức này - do đó hành vi 'lạ'.

Bạn có thể xem cách thức này hoạt động nếu bạn pre-compile your application using aspnet_compiler.exe. Bạn sẽ nhận được các tệp DLL đã biên dịch cho từng trang biểu mẫu web của bạn; chỉ cần mở một trong những người trong Reflector để xem mã được tạo ra. Tôi đã viết một tương đương tối thiểu của mã của bạn với biến tuyên bố bên ngoài thẻ đầu, và đây là cấp cao nhất làm cho phương pháp mà tôi nhận:

private void __Render__control1(HtmlTextWriter __w, Control parameterContainer) 
{ 
    string str = "scripts/"; 
    __w.Write("\r\n<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\r\n\r\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\r\n"); 
    parameterContainer.Controls[0].RenderControl(__w); 
    __w.Write("\r\n<body>\r\n "); 
    parameterContainer.Controls[1].RenderControl(__w); 
    __w.Write("\r\n <script type=\"text/javascript\" src=\""); 
    __w.Write(str); 
    __w.Write("jquery-1.4.1.min.js\"></script>\r\n</body>\r\n</html>\r\n"); 
} 

Bạn thấy rằng biến mà tôi tuyên bố (ở đây đặt tên str) là phạm vi cho phương pháp này và gọi phương thức khác để hiển thị đầu (và phần tử biểu mẫu được đánh dấu runat="server".)

Giải pháp nhanh chóng và bẩn có thể đơn giản là xóa runat="server" khỏi thẻ đầu; tuy nhiên, tôi khuyên bạn nên khai báo một biến được bảo vệ trong lớp mã-đằng sau của bạn cho điều này. Việc thêm một dòng như thế này vào tệp mã-đằng sau của bạn sẽ hoạt động:

protected string scriptPath, gkoConfig; 

Sau đó, bạn có thể sử dụng các biến này ở bất kỳ đâu trong mã Biểu mẫu web.

+0

khi bạn nói "code-behind lớp", điều gì làm bạn có ý nghĩa (ví dụ, đối với một trang như index.aspx)? – serhio

+0

Lớp mã-đằng sau là lớp được khai báo trong tệp .cs cho trang, ví dụ: index.aspx.cs cho index.aspx. –

+0

ok, hiểu rõ. Tôi bắt đầu học MVC trực tiếp whitout có "cổ điển" ASP kinh nghiệm này lý do tại sao tôi đã không hiểu ban đầu .. Cảm ơn! – serhio

0

Tôi nghi ngờ người đứng đầu trang ASPX được xử lý riêng biệt với nội dung.

Sự cố này dễ dàng được giải quyết - tất cả những gì bạn cần làm là sử dụng trường lớp trong mã sau với mức truy cập được đặt thành được bảo vệ.

3

Bạn cũng có thể khai báo các hằng của bạn như thế này:

<script runat="server"> 
    private const string scriptPath = "assets/scripts/"; 
    private const string gkoConfig = "GkoConfig.js"; 
</script>