Lỗi “Name ‘__o’ is not declared” trong trang ASP.NET


Khi viết ASP.NET, bạn có thể gặp trường hợp sau:

– Khi dịch VS sẽ báo lỗi “Name ‘__o’ is not declared”  ở những dòng có dạng output (<%=”my value”%>), mặc dù bạn không có bất kỳ biến nào có tên __o.

– Những dòng lỗi này sẽ bị gạch chân trong trình soạn thảo.

– Tuy nhiên khi chạy chương trình vẫn bình thường.

Lỗi này có nguyên nhân từ trình intelisense của Visual Studio, khi bạn viết chương trình, intellisense sẽ tự động dịch và xây dựng cấu trúc trang web để hỗ trợ tính năng “xổ” các thành phần của một đối tượng (như khi bạn gõ dấu chấm, chúng sẽ hiển thị danh sách các thành phần bên trong chẳng hạn). Mỗi khi bạn xuất ra một biến lần đầu tiên trong trang, nó sẽ khai báo một biến có tên __o để lưu giá trị biến đó, trong những lần xuất giá trị sau, biến này sẽ được dùng lại. Do vậy, nếu câu lệnh xuất đầu tiên của bạn nằm trong một khối lệnh, những câu lệnh xuất sau sẽ bị lỗi vì biến trên chỉ có thể được hiểu trong khối lệnh đó. Ví dụ:

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

Đoạn lệnh này sẽ được dịch như sau:

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

Ở đây, câu lệnh gán thứ 2 sẽ báo lỗi.

Sửa lỗi:

Vì đây là lỗi của M$ nên bạn không sửa được :D, nhưng bạn có thể dùng mẹo thêm câu lệnh giả <%=”” %> vào đầu trang để biến __o được sinh ra từ đầu.

Chúc thành công.

(Theo hướng dẫn của Mikhail Arkhipov tại http://forums.asp.net/p/923745/1266105.aspx)

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s