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.
Nguồn
2012-06-08 18:29:54
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
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. –
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