Bộ sưu tập Điều khiển không thể được sửa đổi vì điều khiển chứa các khối mã


370

Tôi đang cố gắng tạo một điều khiển người dùng đơn giản đó là một thanh trượt. Khi tôi thêm SliderExtender AjaxToolkit vào điều khiển người dùng, tôi gặp lỗi này (* & $ # () @ #:

Server Error in '/' Application. The Controls collection cannot be modified because the control contains code blocks (i.e. `<% ... %>`). Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: System.Web.HttpException: The Controls collection cannot be modified because the control contains code blocks (i.e. `<% ... %>`).

Source Error:

An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.

Stack Trace:

[HttpException (0x80004005): The Controls collection cannot be modified because the control contains code blocks (i.e. `<% ... %>`).]    System.Web.UI.ControlCollection.Add(Control child) +8677431    AjaxControlToolkit.ScriptObjectBuilder.RegisterCssReferences(Control control) in d:\E\AjaxTk-AjaxControlToolkit\Release\AjaxControlToolkit\ExtenderBase\ScriptObjectBuilder.cs:293 AjaxControlToolkit.ExtenderControlBase.OnLoad(EventArgs e) in d:\E\AjaxTk-AjaxControlToolkit\Release\AjaxControlToolkit\ExtenderBase\ExtenderControlBase.cs:306 System.Web.UI.Control.LoadRecursive()
+50    System.Web.UI.Control.LoadRecursive()
+141    System.Web.UI.Control.LoadRecursive()
+141    System.Web.UI.Control.LoadRecursive()
+141    System.Web.UI.Control.LoadRecursive()             
+141    System.Web.UI.Control.LoadRecursive()
+141    System.Web.UI.Control.LoadRecursive()
+141    System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +627


Version Information: Microsoft .NET Framework Version:2.0.50727.3074; ASP.NET Version:2.0.50727.3074

Tôi đã thử đặt một trình giữ chỗ trong điều khiển người dùng và thêm hộp văn bản và bộ mở rộng thanh trượt vào trình giữ chỗ theo chương trình và tôi vẫn gặp lỗi.

Đây là mã đơn giản:

<table cellpadding="0" cellspacing="0" style="width:100%">
    <tbody>
        <tr>
            <td></td>
            <td>
                <asp:Label ID="lblMaxValue" runat="server" Text="Maximum" CssClass="float_right" />
                <asp:Label ID="lblMinValue" runat="server" Text="Minimum" />
            </td>
        </tr>
        <tr>
            <td style="width:60%;">
                <asp:CheckBox ID="chkOn" runat="server" />
                <asp:Label ID="lblPrefix" runat="server" />:&nbsp;
                <asp:Label ID="lblSliderValue" runat="server" />&nbsp;
                <asp:Label ID="lblSuffix" runat="server" />
            </td>
            <td style="text-align:right;width:40%;">                

                    <asp:TextBox ID="txtSlider" runat="server" Text="50" style="display:none;" />
                    <ajaxToolkit:SliderExtender ID="seSlider" runat="server" 
                        BehaviorID="seSlider" 
                        TargetControlID="txtSlider" 
                        BoundControlID="lblSliderValue" 
                        Orientation="Horizontal" 
                        EnableHandleAnimation="true" 
                        Length="200" 
                        Minimum="0" 
                        Maximum="100" 
                        Steps="1" />

            </td>
        </tr>
    </tbody>
</table>

Vấn đề là gì?


11
Điều gây ra lỗi này cho tôi là sử dụng <% = Resolve (); Hàm%> bên trong các thẻ <script> và <link>. Cuối cùng tôi đã sửa cái này. Thay vì loại bỏ mã vi phạm trong thẻ head thường gây ra lỗi này. Chỉ cần đặt tất cả các mã vi phạm vào thẻ <asp: ContentPlaceHolder> </ asp: ContentPlaceHolder>.
Daniel P

stackoverflow.com/questions/4995274/ Từ Chứa phần giải thích dài hơn cho @Daniel Pđề xuất.
lko

Câu trả lời:


498

Đầu tiên, bắt đầu khối mã với <% # thay vì <% =:

<head id="head1" runat="server">
  <title>My Page</title>
  <link href="css/common.css" rel="stylesheet" type="text/css" />
  <script type="text/javascript" src="<%# ResolveUrl("~/javascript/leesUtils.js") %>"></script>
</head>

Điều này thay đổi khối mã từ khối mã Feedback.Write thành biểu thức cơ sở dữ liệu.
<%# ... %>biểu thức cơ sở dữ liệu không phải là khối mã, CLR sẽ không phàn nàn. Sau đó, trong mã cho trang chính, bạn sẽ thêm vào như sau:

protected void Page_Load(object sender, EventArgs e)
{
  Page.Header.DataBind();    
}

Tôi không gặp phải lỗi này, nhưng tôi đang sử dụng ký hiệu =. Tuy nhiên: Tôi đã thấy mã của mình thất bại với vấn đề được mô tả ở trên. Điều gì có thể gây ra điều đó (tại sao nó hoạt động tốt với tôi)?
doekman

3
Tôi dường như bắt đầu gặp vấn đề này sau khi chuyển sang ASP.NET 4. Nó có bị cô lập với khung công tác mới không?
Corgalore

3
Nó được giải quyết khi tôi sao chép và dán mã Java Script của tôi xuống cuối trang. Trước đây, nó được đặt trong thẻ CHÍNH.
Miank

1
Đây là một lỗi kỳ lạ với .NET. Tại sao #thay vì =. Tôi sẽ không bao giờ hiểu điều này, đã làm nó trong nhiều năm nhưng ước gì tôi biết TẠI SAO!
Mark Pieszak - Trilon.io

1
Anh hùng không áo choàng nếu họ tồn tại!
Julián

253

Tôi chỉ gặp vấn đề này là tốt nhưng tìm thấy một giải pháp khác.

Tôi thấy rằng việc bọc các khối mã bằng thẻ asp: PlaceHolder-giải quyết vấn đề.

<asp:PlaceHolder runat="server">
  <meta name="ROBOTS" content="<%= this.ViewData["RobotsMeta"] %>" />
</asp:PlaceHolder>

(CMS tôi đang sử dụng đang chèn vào phần đầu từ một số mã phía sau đã hạn chế tôi thêm các khối điều khiển tùy chỉnh với nhiều thông tin khác nhau như thẻ meta, v.v ... vì vậy đây là cách duy nhất nó hoạt động với tôi.)


11
Tuyệt vời. Là người dùng trước đây của các điều khiển Telerik, tôi thường sử dụng "RadCodeBlock" của họ cho cùng một mục đích, nhưng luôn cảm thấy khó chịu vì thực tế tôi không biết gì ngoài điều đó (hoặc như những người khác đã đề cập, chuyển mã vào một thẻ được thực hiện để chạy phía máy chủ). Tôi không bao giờ biết những người giữ chỗ này có thể có nội dung bên trong họ. Cảm ơn bạn!
JayC

1
Thực sự cảm ơn bạn @JayC, RadCodeBlock là đề xuất duy nhất trên trang này hoạt động với mã tôi được thừa kế, vì nhiều lý do.
shiser

Điều này cũng xảy ra với các điều khiển DevExpress đã đăng ký. Tôi có hai ứng dụng web với mã trang, cấu hình và trang chủ gần như giống hệt nhau. Chỉ có một với DevExpress yêu cầu một cách giải quyết như thế này. Tôi nghĩ rằng đó là một cái gì đó để làm với trình xử lý HTTP, tập hợp tài nguyên của họ hoặc một cái gì đó tương tự làm rối tung đường ống. Hiện chúng tôi đang chuyển khỏi các thư viện bên thứ 3 để ủng hộ JQuery và MVC, cho phép bạn tránh các trình xử lý / mã phía máy chủ phức tạp.
Tony Wall

Trên thực tế, nó đủ để bọc nó với <div runat = "server"> <% = (...)%> </ div>
Zbigniew Wiadro

5
@Teomanshipahi Thực ra khá đơn giản - sử dụng các khối mã bên trong một container có nghĩa là bạn không còn có thể cập nhật Controlscontainer đó nữa. Này về cơ bản khai thác hành vi này bằng cách đặt các khối mã trong một container riêng biệt - vì vậy các lỗi sẽ chỉ hiển thị nếu bạn muốn sửa đổi Controlscủa PlaceHolder, chứ không phải là sự kiểm soát của phụ huynh. PlaceHolderlà một lựa chọn tuyệt vời cho việc này, bởi vì nó không có bất kỳ mã nào của riêng nó (không giống như, nói Panelhoặc <div runat="server">). Mặc dù tôi thường sử dụng nó theo cách khác - đặt các điều khiển tôi cần sửa đổi PlaceHolder.
Luaan 14/07/2015

55

Tôi có thể xác nhận rằng việc di chuyển javascript bằng <% %>các thẻ từ đầu đến thẻ biểu mẫu sẽ khắc phục lỗi này

http://italez.wordpress.com/2010/06/22/ajaxcontroltoolkit-calendarextender-e-strana-eccezione/


1
Có, chỉ cần xác nhận, xóa thẻ ASP <%%> khỏi đầu sửa lỗi này.
Corgalore

+1, xác nhận là tốt. Đối với tôi mặc dù kịch bản có vấn đề nằm ngoài cả yếu tố đầu và hình thức.
user420667

Đã xác nhận. Hoạt động như một cơ duyên đối với tôi. Chỉ cần đừng quên kiểm tra các tập lệnh trên trang chính của bạn vì đây là người gây rắc rối cho tôi và tôi đã dành nửa giờ trước khi nhận ra rằng đó không phải là aspx của tôi: P
Luis Hernández

Vâng, điều này làm việc cho tôi quá, nhưng tại sao? Thẻ <HEAD> trong tệp Master có nghĩa là hoàn toàn dành cho tệp Master và không có tệp phụ aspx? Tôi hỏi bởi vì tôi đang cố chạy mã JS trong trang phụ aspx nằm trong tệp chính.
Fandango68

31

Đặt javascript dưới thẻ div.

<div runat="server"> //div tag must have runat server
  //Your Jave script code goes here....
</div>

Nó sẽ hoạt động !!


5
Hoặc tốt hơn, sử dụng trình giữ chỗ để đầu ra không có mã html bổ sung.
Chris Haines

1
Điều này hoạt động, mặc dù Visual Studio nói rằng nó vi phạm tiêu chuẩn HTML5 để lồng <div> trong <head>.
Adi Inbar

IMHO, không phải giải pháp tốt nhất nếu HTML5 không xác thực, tránh div trong headphần.
PreguntonCojoneroCabrón

8

bạn có thể thực hiện chức năng tương tự nếu bạn đang sử dụng trình quản lý tập lệnh trong trang của mình. bạn chỉ cần đăng ký kịch bản như thế này

<asp:ScriptManager ID="ScriptManager1" runat="server" LoadScriptsBeforeUI="true"   EnablePageMethods="true">  
<Scripts>
      <asp:ScriptReference Path="~/Styles/javascript/jquery.min.js" />
</Scripts>
</asp:ScriptManager>

ScriptManagerkhông thêm tập lệnh trong phần đầu ?
Kiquenet

5

Tôi đã có vấn đề tương tự trong kiểm soát người dùng. Trang của tôi đang lưu trữ điều khiển có các bình luận trong thẻ head, tôi đã xóa những bình luận đó, mọi thứ đều hoạt động sau đó. Một số bài viết cũng đề nghị loại bỏ các tập lệnh khỏi đầu và đặt chúng vào cơ thể.


5

Tôi đã thử sử dụng <%# %>mà không thành công. Sau đó, tôi đã thay đổi Page.Header.DataBind();mã của mình phía sau this.Header.DataBind();và nó hoạt động tốt.


4

Trong trường hợp của tôi, tôi đã thay thế <%= %>bằng <%# %>, và nó làm việc!



2

Kỹ thuật liên kết dữ liệu "<% #" sẽ không hoạt động trực tiếp bên trong các thẻ <link> trong thẻ <head>:

<head runat="server">

  <link rel="stylesheet" type="text/css" 
        href="css/style.css?v=<%# My.Constants.CSS_VERSION %>" />

</head>

Đoạn mã trên sẽ đánh giá

<head>

  <link rel="stylesheet" type="text/css" 
        href="css/style.css?v=&lt;%# My.Constants.CSS_VERSION %>" />

</head>

Thay vào đó, bạn nên làm như sau (lưu ý hai dấu ngoặc kép bên trong):

<head runat="server">

  <link rel="stylesheet" type="text/css" 
        href="css/style.css?v=<%# "" + My.Constants.CSS_VERSION %>" />

</head>

Và bạn sẽ nhận được kết quả mong muốn:

<head>

  <link rel="stylesheet" type="text/css" href="css/style.css?v=1.5" />

</head>

2

Tôi đã có vấn đề này, nhưng không thông qua Tiêu đề. Giữ chỗ của tôi là trong cơ thể. Vì vậy, tôi đã thay thế tất cả <%=với <%#và đã làm

protected void Page_Load(object sender, EventArgs e)
{
    Page.Header.DataBind();    
}

va no đa hoạt động.


1

Một cách khác là để một trang .aspx khác hoạt động như trang bạn muốn liên kết đến.

Đây là tiêu đề của Masterpage trông như thế nào:

<head runat="server">
    <asp:ContentPlaceHolder ID="head" runat="server">
    </asp:ContentPlaceHolder>
    <link href="CSS/AccordionStyles.aspx" rel="stylesheet" type="text/css" />
</head>

Biểu mẫu .aspx được tham chiếu chứa nội dung của bạn:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="AccordionStyles.aspx.cs" Inherits="IntranetConnectCMS.CSS.AccordionStyles" %>
.AccordionHeader
{
    cursor: pointer;
    background-image: url(<%=ResolveUrl("~/Images/Backgrounds/AccordionPaneHeaderClosed.png") %>);
    background-repeat: no-repeat;
}

.AccordionHeaderSelected
{
    cursor: pointer;
    background-image: url(<%=ResolveUrl("~/Images/Backgrounds/AccordionPaneHeaderOpen.png") %>);
    background-repeat: no-repeat;
}
.AccordionContent
{
    background-image: url(<%=ResolveUrl("~/Images/Backgrounds/AccordionPaneContent.png") %>);
    background-repeat: no-repeat;
}

Cuối cùng, bạn cần trang .aspx để thông báo cho trình duyệt bạn đang gửi nội dung CSS:

protected void Page_Load(object sender, EventArgs e)
{
    Response.ContentType = "text/css";
}

1

Tôi cũng phải đối mặt với vấn đề tương tự. Tôi tìm thấy các giải pháp như sau.

Giải pháp 1: Tôi giữ thẻ script của mình trong cơ thể.

<body>
   <form> . . . .  </form>
    <script type="text/javascript" src="<%= My.Working.Common.Util.GetSiteLocation()%>Scripts/Common.js"></script> </body>

Bây giờ xung đột về các thẻ sẽ giải quyết.

Giải pháp 2:

Chúng tôi cũng có thể giải quyết một trong những giải pháp trên như Thay thế khối mã bằng <% # thay vì <% = Nhưng vấn đề là nó sẽ chỉ cung cấp đường dẫn tương đối . Nếu bạn muốn con đường thực sự tuyệt đối thì nó sẽ không hoạt động.

Giải pháp 1 làm việc cho tôi. Tiếp theo là sự lựa chọn của bạn.


1

Tôi có cùng một vấn đề, nhưng nó không liên quan gì đến JavaScript. Xem xét mã này:

<input id="hdnTest" type="hidden" value='<%= hdnValue %>' />
<asp:PlaceHolder ID="phWrapper" runat="server"></asp:PlaceHolder>
<asp:PlaceHolder ID="phContent" runat="server" Visible="false">
    <b>test content</b>
</asp:PlaceHolder>

Trong tình huống này, bạn sẽ gặp lỗi tương tự mặc dù PlaceHolders không có bất kỳ khối mã độc hại nào, điều đó xảy ra do hdnTest không điều khiển máy chủ sử dụng các khối mã.

Chỉ cần thêm runat = server vào hdnTest và vấn đề được giải quyết.


1

Tôi đã giải quyết một lỗi tương tự như thế này bằng cách đặt <script>bên contentplaceholdertrong vào bên trong <head>thay vì đặt <script>bên ngoài nói contentplaceholderbên trong<head>


1

Tôi đã có cùng một vấn đề với các trường hợp khác nhau.
Tôi đã có yếu tố đơn giản bên trong thẻ cơ thể.
Giải pháp là:

<asp:PlaceHolder ID="container" runat="server">
    <a id="child" href="<%# variable %>">Change me</a>
</asp:PlaceHolder>
protected new void Page_Load(object sender, EventArgs e)
{    
    Page.Form.DataBind(); // I neded to Call DataBind on Form not on Header
    container.InnerHtml = "Simple text";
}

1

Tôi gặp vấn đề tương tự với hệ thống của mình, tôi đã xóa mã JavaScript khỏi trang của mình và đặt nó ở phần thân ngay trước khi đóng thẻ body


0

Đối với một số trường hợp, ResolveUrl và ResolveClientUrl hoạt động nhưng không phải lúc nào cũng đặc biệt trong trường hợp tệp tập lệnh js. Điều gì xảy ra là nó hoạt động đối với một số trang nhưng khi bạn điều hướng đến một số trang khác thì nó có thể không hoạt động do đường dẫn tương đối của trang cụ thể đó.

Vì vậy, cuối cùng đề nghị của tôi là luôn kiểm tra lại toàn bộ các trang trên trang của bạn xem liệu tất cả các tài liệu tham khảo javascript của bạn có tốt hay không. Mở trang web của bạn trong Google Chrome -> nhấp chuột phải vào trang -> nhấp vào xem trang nguồn -> HTML xuất hiện -> bây giờ nhấp vào siêu liên kết JS của bạn; Nếu nó hoạt động tốt, nó sẽ mở tệp js trong cửa sổ trình duyệt khác, nếu không nó sẽ không mở.


0

Hãy thử viết mã script java của bạn bên ngoài thẻ head, nó chắc chắn sẽ hoạt động. Tôi đã giải quyết khi tôi sao chép và dán mã Java Script của mình vào cuối trang. Trước đây, nó được đặt trong thẻ HEAD ngay trước khi đóng thẻ biểu mẫu.

    </div>
        <script>
                    function validate() {
                        try {

                        var username = document.getElementById("<%=txtUserName.ClientID%>").value;
                        var password = document.getElementById("<%=txtPWD.ClientID%>").value;

                            if (username == "" && password == "")
                                alert("Enter Username and Passowrd");
                            else {
                                if (username == "")
                                    alert("Enter Username");
                                else if (password == "")
                                    alert("Enter Password");
                            }

                        }

                    catch (err) {
                    }
                }
                </script>
</form>

0

Xóa phần có thẻ máy chủ và đặt nó ở nơi khác nếu bạn muốn thêm điều khiển động từ mã phía sau

Tôi đã xóa JavaScript của mình khỏi phần đầu của trang và thêm nó vào phần thân của trang và làm cho nó hoạt động


0

Trong trường hợp của tôi, tôi đã gặp lỗi này vì tôi đã cài đặt sai nội bộ thành div với html bên trong nó.

Thí dụ:

SuccessMessagesContainer.InnerText = "";

   <div class="SuccessMessages ui-state-success" style="height: 25px; display: none;" id="SuccessMessagesContainer" runat="server">
      <table>
         <tr>
            <td style="width: 80px; vertical-align: middle; height: 18px; text-align: center;">
               <img src="<%=Image_success_icn %>" style="margin: 0 auto; height: 18px;
                  width: 18px;" />
            </td>
            <td id="SuccessMessage" style="vertical-align: middle;" class="SuccessMessage" runat="server" >
            </td>
         </tr>
      </table>
   </div>

-1

Thẻ <%= %>không hoạt động thành một thẻ với runat="server". Di chuyển mã của bạn với <%= %>vào runat="server"một thẻ thông tin khác ( body, head, ...), hoặc loại bỏ runat="server"từ thùng chứa.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.