Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/29.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用UpdatePanel时出现JScript运行时错误_C#_Asp.net_Ajaxcontroltoolkit - Fatal编程技术网

C# 使用UpdatePanel时出现JScript运行时错误

C# 使用UpdatePanel时出现JScript运行时错误,c#,asp.net,ajaxcontroltoolkit,C#,Asp.net,Ajaxcontroltoolkit,我正在尝试使用AJAX工具包的UpdatePanel创建一个动态UI 让我解释一下我的应用程序的上下文。有很多个人资料。每个概要文件都有许多产品类。每个产品类别都有许多产品。 我正在对产品进行比较 配置文件由RadioButtonList表示(动态创建)。对于所选配置文件的每个产品类别,需要 可以动态创建,允许用户选择该类别的产品 第一个选择的一切都很好。但是,当我尝试选择其他产品并第二次单击“提交”时,会引发以下错误: Microsoft JScript运行时错误: Sys.WebForms.

我正在尝试使用AJAX工具包的
UpdatePanel
创建一个动态UI

让我解释一下我的应用程序的上下文。有很多个人资料。每个概要文件都有许多产品类。每个产品类别都有许多产品。 我正在对产品进行比较

配置文件由
RadioButtonList
表示(动态创建)。对于所选配置文件的每个产品类别,需要 可以动态创建,允许用户选择该类别的产品

第一个选择的一切都很好。但是,当我尝试选择其他产品并第二次单击“提交”时,会引发以下错误:

Microsoft JScript运行时错误: Sys.WebForms.PageRequestManagerServerErrorException:回发无效 或回调参数。在配置或页面中使用启用事件验证

任何关于抛出此错误原因的提示都将非常有用

protected void Page_Load(object sender, EventArgs e)
{
    pnlDynamic.Visible = false;     
    if (!this.IsPostBack)
    {       
        LoadProfiles();  //Data binding is done for radio button list
    }
    else
    {
        btnSubmit.Enabled = true;
        GenerateProductUI(ProfileID); //DropDownLists are dynamically created and populated from database
        //ProfileID is the selected profile id
    }
}     


 <asp:UpdatePanel runat="server" id="UpdatePanel" updatemode="Conditional">
    <Triggers>
        <asp:AsyncPostBackTrigger controlid="rblProfiles" eventname="SelectedIndexChanged" />
    </Triggers>
     <ContentTemplate>      
        <asp:Panel ID="Panel1" runat="server">
            <asp:RadioButtonList ID="rblProfiles" runat="server" AutoPostBack="True"
                onselectedindexchanged="rblProfiles_SelectedIndexChanged">
            </asp:RadioButtonList>
        </asp:Panel>        
        <br />
        <asp:Panel ID="pnlDynamic" runat="server" Visible="false">                                  
            <asp:Panel ID="Panel2" runat="server">
                <asp:Table ID="table" runat="server"/>      <!-- Product dropdowns generated in table -->             
            </asp:Panel>                
        </asp:Panel>        
        <br />
    </ContentTemplate>
</asp:UpdatePanel>

<asp:Button ID="btnSubmit" runat="server" Text="Submit" onclick="btnSubmit_Click" CssClass="btnSubmit" AutoPostBack="True" /> 

<asp:UpdatePanel runat="server" id="UpdatePanel1" updatemode="Conditional">
    <Triggers>
        <asp:AsyncPostBackTrigger controlid="btnSubmit" eventname="Click" />
    </Triggers>
     <ContentTemplate> 

    <asp:Panel ID="pnlResult" runat="server" Visible="false">
     <!--Result displayed-->
    </asp:Panel>      
    <br />
    </ContentTemplate>
</asp:UpdatePanel>
受保护的无效页面加载(对象发送方,事件参数e)
{
pnlDynamic.Visible=false;
如果(!this.IsPostBack)
{       
LoadProfiles();//单选按钮列表的数据绑定已完成
}
其他的
{
btnSubmit.Enabled=true;
GenerateProductUI(ProfileID);//DropDownList是从数据库动态创建和填充的
//ProfileID是选定的配置文件id
}
}     




重要!每个曾经禁用事件验证的人都应该了解他正在禁用什么

假设您有一个博客应用程序(或银行应用程序),并且有一个评论(或银行帐户)列表。所有用户都可以看到评论(或帐户),但只有版主(或经理)可以删除它们。因此,根据用户的访问权限,您可以编写一个复选框来切换delete button visible属性。非版主(管理员)的用户无法删除评论(帐户)。问题解决了

但是,如果禁用事件验证,恶意用户可以发送post请求,声称已按下删除按钮,尽管该按钮从未为其启用。通常情况下,事件验证会启动并产生异常,但如果禁用,ASP.NET不会检查按钮是否可见,只会运行按钮单击处理程序代码,注释(帐户)将被删除。如果您检查用户是否可以在按钮单击事件中删除,但还应考虑另一个开发人员稍后会出现,并添加另一个按钮(编辑),而不注意事件验证已被禁用。现在,页面上的所有其他按钮都需要进行相应的检查。如果禁用事件验证,请非常小心

出现此错误的原因是您正在从呈现原始页面时不存在的控件触发回发。解决此问题的一种方法是禁用此页面的事件验证,但您应该确保检查请求更改事件本身的用户的凭据,否则这是一个安全问题,因为用户将能够“按下”一个根本没有呈现的按钮(例如,在他无权访问的产品上)

您可以通过page指令禁用事件验证:

<%@ Page EnableEventValidation="false" ... %> 

我相信也可以将更新面板的更新模式设置为“始终”,而不是“有条件”,这可能会解决问题(您能试试并告诉我们吗?),但这将增加通过网络发送的数据。如果这是一个好的折衷方案,则取决于您的用例,取决于页面上的更新面板的数量和大小(越多越差)。如果它是一个内部应用程序,或者这个UI访问相对较少,我会选择这种方法(假设它可以工作,因为我没有验证它)


顺便说一句,这实际上不是一个脚本错误。您将得到一个客户端脚本错误,这仅仅是因为错误通过AJAX请求显现出来。这纯粹是由于代码可能存在安全问题而引发的服务器错误。

在页面顶部添加

创建动态下拉列表后,必须在每次页面初始化或页面加载时重新创建它们或任何动态创建的控件。在这种情况下,您不需要使用
EnableEventValidation=“false”


或者只需将
GenerateProductUI(ProfileID)
Page\u Load
移动到
Page\u Init

您不会轻易完成这项操作。默认情况下启用事件验证是有原因的。如果您这样做,您必须自己注意安全性,并且每次作为解决方案提供禁用事件验证时都应该指出这一点。否则,我们将得到大量不安全的ASP.NET应用程序。谢谢<代码>EnableEventValidation=“false”工作正常。将
UpdatePanel
设置为“始终”不起作用。我的产品下拉列表正在消失。可能是我遗漏了一些东西。可能是你没有在回邮时创建它们,或者可能是我错了。如果坚持禁用事件验证,请确保对此页面上的每个控件事件执行适当的授权检查。您不仅禁用了单选按钮的验证,还禁用了所有其他可以提交页面的控件的验证。我的应用程序没有用户登录。它应该是一个开放的网页。将事件验证设置为false是否会引起任何问题?否,但请确保在下次遇到此问题时了解要禁用的内容。我用解释更新了我的答案。
protected void Page_Load(object sender, EventArgs e)
{
    pnlDynamic.Visible = false;     
    if (!this.IsPostBack)
    {       
        LoadProfiles();  //Data binding is done for radio button list
    }
    else
    {
        btnSubmit.Enabled = true;
    }

        GenerateProductUI(ProfileID); //DropDownLists are dynamically created and populated from database
        //ProfileID is the selected profile id
}