2013-07-23 49 views
56

Gần đây, chúng tôi đã nâng cấp tất cả các dự án WebForms của chúng tôi lên .NET 4.5 và gặp sự cố phân tích cú pháp khi tải các trang có phần tử iFrame. Chúng tôi đã sửa lỗi này bằng cách chuyển đổi số iFrame từ HtmlGenericControl thành HtmlIframe. Điều này đã sửa tất cả các lỗi trình phân tích cú pháp khi chúng tôi chạy mã của chúng tôi cục bộ.Lỗi trình phân tích cú pháp iFrame sau khi nâng cấp lên .NET 4.5

Khi chúng tôi triển khai ứng dụng, chúng tôi nhận được thông báo lỗi sau:

Parser Error Message: Các lớp cơ sở bao gồm các lĩnh vực 'khung', nhưng kiểu của nó (System.Web.UI.HtmlControls.HtmlIframe) là không tương thích với các loại hình kiểm soát (System.Web.UI.HtmlControls.HtmlGenericControl). **

Khi tôi triển khai các mã cũ với HtmlGenericControl lỗi đi xa gợi ý rằng mặc dù chúng ta đã cài đặt. NET 4.5, máy chủ vẫn đang sử dụng phiên bản cũ hơn?

Tôi đã thử gỡ bỏ và cài đặt lại .NET nó đảm bảo đăng ký asp với IIS.

Windows 2008 R2 với IIS 7.5 và .NET 4.5

Trả lời

18

Chúng tôi đã có thể khắc phục vấn đề chuyển đổi

<iframe id="iframe" runat="server" /> 

để

<asp:HtmlIframe id="iframe" runat="server" /> 
+6

Trả lời không đề cập đến bạn phải thêm không gian tên 'System.Web.UI.HtmlControls' vào Web.config. (Xem Panoj để có câu trả lời hoàn chỉnh). –

+0

Hoặc thêm không gian tên trong tệp aspx cụ thể. –

6

Kiểm tra xem bạn có cài đặt tiếp theo nào trong tệp cấu hình hay không. Ngoài ra hãy chắc chắn rằng nó có sau khi xuất bản.

<system.web> 
    <httpRuntime targetFramework="4.5" /> 
    <compilation debug="true" targetFramework="4.5"/> 
    ... 
</system.web> 

Hy vọng điều đó sẽ hữu ích.

+1

Cảm ơn! Tôi đã vô tình xóa 'targetFramework =" 4.5 "' trong nút biên dịch của tôi để khắc phục lỗi sản xuất, và sau đó bắt đầu nhận được lỗi này trên localhost của tôi. Câu trả lời này đã cứu tôi :) – Shiva

29

Bạn cần phải thêm các thẻ sau:

<asp:HtmlIframe> 

và trong thiết kế, thay đổi loại kiểm soát để:

System.Web.UI.HtmlControls.HtmlIframe 

Thêm dòng sau trong Web.config:

<controls> 
<add tagPrefix="asp" namespace="System.Web.UI.HtmlControls" assembly="System.Web"/> 
</controls> 

này nên sửa chữa nó.

+0

Cảm ơn bạn đã nhập vào như bạn có thể, xem từ câu trả lời được chấp nhận ở trên, sự cố đã được khắc phục một thời gian trước đây. – gambisk

+3

Sau khi nâng cấp dự án .NET 3.5 lên 4.5, tôi đã thiếu thẻ aspPrefix trong các điều khiển tránh được thẻ * Máy chủ không xác định 'asp: HtmlIframe'. * Lỗi trình phân tích cú pháp. –

+0

Có bất kỳ điều khiển nào khác có thay đổi đột phá như thế này không? –

66

Vấn đề cơ bản là không tương thích giữa đối tượng được tạo từ điều khiển máy chủ IFRAME của biểu mẫu Web của trình biên dịch ASP.NET (biên dịch tệp ASPX và ASCX thành mã C# hoặc VB) và loại biến tương ứng với điều khiển đó trong mã Biểu mẫu web của bạn phía sau. Điều khiển máy chủ IFRAME (<iframe id="frame" runat="server" />) sẽ được phân tích cú pháp dưới dạng điều khiển của một loại cụ thể. Trong ASP.NET 4, một điều khiển máy chủ IFRAME sẽ là một điều khiển HtmlGenericControl. Trong ASP.NET 4.5, một điều khiển máy chủ IFRAME sẽ là một điều khiển HtmlIframe.

Sự cố có thể được khắc phục bằng cách đảm bảo rằng thuộc tính targetFramework trên phần tử biên dịch trong tệp web.config đồng ý với thuộc tính Khung mục tiêu của dự án của bạn và biến tương ứng với điều khiển máy chủ IFRAME của bạn khớp với loại điều khiển trình biên dịch ASP.NET sẽ tạo ra.

Dự án ASP.NET 4 đã được chuyển đổi thành .NET Framework 4.5 trong Visual Studio 2013 sẽ sửa đổi web của dự án.tệp cấu hình để thuộc tính targetFramework của phần tử biên dịch có giá trị là "4.5" (<compilation targetFramework="4.5"/>). Điều này làm cho trình biên dịch ASP.NET xử lý điều khiển máy chủ IFRAME dưới dạng điều khiển HtmlIframe. Điều này có thể gây ra sự cố nếu mã Biểu mẫu web phía sau biến điều khiển vẫn là HtmlGenericControl. Lỗi bạn thấy giống như sau:

Lớp cơ sở bao gồm khung 'trường', nhưng loại của nó (System.Web.UI.HtmlControls.HtmlGenericControl) không tương thích với loại điều khiển (System.Web .UI.HtmlControls.HtmlIframe).

Giải pháp cho lỗi trước đó là cập nhật loại biến kiểm soát máy chủ tương ứng với điều khiển máy chủ IFRAME. Bạn có thể thực hiện việc này bằng cách lưu lại tệp HTML của biểu mẫu web sẽ khiến tệp thiết kế được tạo lại. Theo như tôi có thể thấy (trong Visual Studio 2013 ít nhất) thay đổi ID kiểm soát là không cần thiết. Nếu biến điều khiển máy chủ nằm trong mã phía sau tệp, nó phải được cập nhật theo cách thủ công.

Dự án ASP.NET 4.5 nơi mã sau biến là một HtmlIframe sẽ gặp vấn đề tương tự nhưng khác nhau nếu thuộc tính targetFramework của phần tử biên dịch trong tệp web.config có giá trị là "4.0" (<compilation targetFramework="4.0"/>). Điều này làm cho trình biên dịch ASP.NET điều trị kiểm soát máy chủ IFRAME dưới dạng điều khiển HtmlGenericControl. Lỗi bạn thấy giống như sau:

Lớp cơ sở bao gồm khung 'trường', nhưng loại của nó (System.Web.UI.HtmlControls.HtmlIframe) không tương thích với loại điều khiển (System.Web .UI.HtmlControls.HtmlGenericControl).

Cách khắc phục lỗi trước đó là đảm bảo cài đặt biên dịch web.config đồng ý với thuộc tính Khung mục tiêu của dự án. Trong trường hợp này thuộc tính targetFramework của phần tử biên dịch trong web.config phải có giá trị là "4.5".

<compilation targetFramework="4.5"/>


Lưu ý: Thiết lập thuộc tính targetFramework yếu tố httpRuntime để 4.5 cũng sẽ có tác dụng thiết lập thuộc tính targetFramework các yếu tố tổng hợp để 4.5. Xem http://blogs.msdn.com/b/webdev/archive/2012/11/19/all-about-httpruntime-targetframework.aspx để biết thêm thông tin.

Lưu ý 2: Không có thẻ <asp:HtmlIframe>. Đăng ký tiền tố thẻ "asp" vào không gian tên System.Web.UI.HtmlControls không phải là thứ cần thiết để sử dụng điều khiển máy chủ IFRAME.

+0

Bạn có biết nếu ' crush

+0

Trong các thí nghiệm của tôi, '' không ảnh hưởng đến cách trình biên dịch ASP.NET phân tích cú pháp điều khiển '