2009-04-15 23 views
48

Tôi có một số mã trong trang chủ của tôi thành lập một một siêu liên kết với một số bối cảnh thông tin nhạy cảmLàm cách nào để loại bỏ __o không được khai báo?

<%If Not IsNothing(Profile.ClientID) Then%> 
<span class="menu-nav"> 
<a target="_blank" 
    href= 
"http://b/x.aspx?ClientID=<%=Profile.ClientID.ToString()%>&Initials=<%=Session("Initials")%>"  
    > 
    Send 
    <br /> 
    SMS 
    <br /> 
</a> 

</span> 
<%End If %> 

<span class="menu-nav"> <!-- Name __o is not declared Error is flagged here--> 

Bây giờ vấn đề này có vẻ là ở phần href. Nếu tôi xóa mã động thì lỗi sẽ biến mất. Bất cứ ai có thể cho tôi biết làm thế nào để giải quyết vấn đề này?

Trả lời

66

Tôi đã tìm thấy answer trên diễn đàn .net. Nó chứa một lời giải thích tốt về lý do tại sao ASP.Net hành động theo cách đó:

Cuối cùng chúng tôi đã nhận được repro đáng tin cậy và xác định vấn đề cơ bản. Một repro tầm thường trông như thế này:

<% if (true) { %> 
    <%=1%> 
    <% } %> 
    <%=2%> 

Để cung cấp IntelliSense trong <% =%> khối lúc thiết kế, ASP.NET tạo ra nhiệm vụ cho một biến __o tạm thời và ngôn ngữ (VB hoặc C#) sau đó cung cấp intellisense cho biến. Điều đó được thực hiện khi trình biên dịch trang thấy khối <% = ...%> đầu tiên. Nhưng ở đây, khối nằm bên trong if, vì vậy sau khi đóng, biến sẽ nằm ngoài phạm vi. Chúng tôi sẽ tạo ra một cái gì đó như thế này:

if (true) { 
     object @__o; 
     @__o = 1; 
    } 
    @__o = 2; 

Cách giải quyết là thêm biểu thức giả vào đầu trang. Ví dụ. <% = ""%>. Điều này sẽ không hiển thị bất cứ điều gì và nó sẽ đảm bảo rằng __o được khai báo cấp cao nhất trong phương thức Render, trước bất kỳ câu lệnh ‘if’ (hoặc phạm vi khác) tiềm năng nào.

Một giải pháp thay thế là chỉ cần sử dụng

<% response.write(var) %> 

thay vì

<%= var %> 
+0

http://forums.asp.net/p/923745/1266105.aspx –

+0

... <%="" %> ... khắc phục sự cố của tôi, nhưng giải thích về "Chúng tôi sẽ tạo ra một cái gì đó như thế này .. if (true) { đối tượng @__o; @__o = 1; } @__o = 2; " không có ý nghĩa trong ví dụ của tôi, vì tất cả "<%= var %>" của tôi nằm bên trong "IF" đơn của tôi, không có gì bên ngoài và họ đang ném lỗi từ bên trong "IF". –

+0

Việc sử dụng '<%="" %>' làm việc cho tôi, không có lỗi gây phiền nhiễu nhiều hơn nữa ..thxs – Yaroslav

14

Có, đôi khi tôi gặp phải lỗi tương tự trong các trang sử dụng cấu trúc phía máy chủ trên các trang ASPX.

Làm thêm giờ, tôi đã tìm được cách khắc phục (Tôi xin lỗi, tôi chưa thể tìm ra nơi tôi tìm thấy thông tin này một lần nữa.) Và khắc phục đó là đặt mã sau lên trên <%...%> khối:

<%-- For other devs: Do not remove below line. --%> 
<%="" %> 
<%-- For other devs: Do not remove above line. --%> 

Rõ ràng, nơi bạn đặt đoạn mã trên làm cho tất cả sự khác biệt để VS.NET, vì vậy nó có thể mất một vài cố gắng để làm cho nó đúng.

+1

Ngay cả khi tôi đã có '<% = myVarialble%>' trước câu lệnh '<% If ... Then%>' đầu tiên, tôi gặp vấn đề này, nhưng bao gồm cả một nơi khác đã giải quyết nó. Tôi đã thử những nơi khác nhau, và nó không nhất quán ở nơi mà nó thất bại và nó hoạt động ở đâu, vì vậy bạn rất đúng. Nó là cần thiết để thử những nơi khác nhau để có được nó để làm việc. Tôi đặt nó trực tiếp sau khi '

' mà có lẽ sẽ là một nơi tốt trong hầu hết các trường hợp. – awe

+0

Cảm ơn lời nhận xét hữu ích đó, @awe! – Cerebrus

0

Sau vài giờ googling và phân tích bó aspx'ses trong dự án hiện tại của tôi dường như tôi đã tìm thấy các giải pháp, đó là làm việc cho tôi. Sẽ tham mưu mạnh mẽ tránh comments html-style:

<!-- ... -->

bên trong trang aspx. Thay vì nó sử dụng aspx-phong cách bình luận của

<%-- ... --%>

Bên cạnh đó nó đã giúp tôi có được mà vs IntelliSense và mã nổi bật đã trở thành hoạt động trở lại và điều chủ yếu - trường hợp này đã bắt đầu từ nó - vs bây giờ có thể nhấn breakpoint bên trong nhúng các đoạn mã vb/cs! Và không có bất kỳ thông báo nào "Đây không phải là vị trí hợp lệ cho một điểm ngắt".

2

Đây là một giải pháp kỳ quặc, nhưng đối với tôi, tôi đã khắc phục sự cố này bằng cách đơn giản đóng các tệp đang mở vi phạm trong Visual Studio.

Khi chúng mở, tôi đã gặp sự cố __o một cách thất thường.

Ngay khi tôi đóng cửa, sự cố __o đã biến mất.

0

Khi tôi đã làm sạch giải pháp, khởi động lại IIS và nó vẫn còn bí ẩn chơi, tôi thấy điều này đôi khi có thể được gây ra bằng cách dán nội dung của tệp nguồn ASPX từ hệ thống khác vào Visual Studio mà "helpfully" cập nhật mã, có thể thay đổi một số ID và phá vỡ trang.

Dán nó vào trình chỉnh sửa khác (Notepad ++?) Sau đó lưu nó dừng Visual Studio từ "hữu ích" và trang hoạt động lại.

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