使用UpdatePanel时JScript运行错误
本文关键字:运行 错误 JScript UpdatePanel 使用 | 更新日期: 2023-09-27 18:13:21
我正在尝试使用AJAX工具包的UpdatePanel
创建一个动态UI。
让我稍微解释一下我的应用程序的上下文。有许多配置文件。每个配置文件都有许多产品类。每个产品类都有若干产品。我正在实现产品的比较。
概要文件由RadioButtonList
(动态创建)表示。对于所选型材的每个产品类别,需要一个DropDownList
动态创建,允许用户选择该类的产品。
第一次选择一切正常。但是,当我尝试选择另一个产品并第二次单击提交时,抛出以下错误:
Microsoft JScript运行时错误:sys . webforms . pagerequestmanagerservererrorreexception:无效回发或者回调参数。使用配置或<%@页启用事件验证EnableEventValidation="true" %>
任何关于抛出错误原因的提示都将非常有帮助。
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>
重要!每个禁用事件验证的人都应该明白他禁用的是什么!
假设您有一个博客应用程序(或银行应用程序),并且有一个评论(或银行帐户)列表,所有用户都可以看到这些评论(或帐户),但只有版主(或管理员)可以删除它们。因此,根据用户的访问权限,编写一个检查来切换删除按钮的可见属性。非版主(管理员)的用户不能删除评论(帐户)。问题解决了。
然而,如果你禁用事件验证,一个恶意的用户可以发送一个帖子请求,声称已经按下了删除按钮,尽管事实上它从未为他启用过。通常情况下,事件验证将启动并产生一个异常,但如果它被禁用。NET不会检查按钮是否可见,只会运行按钮单击处理程序代码,并删除评论(帐户)。如果您检查用户是否可以在按钮单击事件中删除,则可以防止这种情况,但您也应该考虑到其他开发人员可能会在随后添加另一个按钮(编辑?),而不会注意到事件验证被禁用。同样,现在页面上的所有其他按钮都需要进行适当的检查。如果禁用事件验证,请非常小心!
出现错误是因为您正在从呈现原始页面时不存在的控件触发回发。修复它的一种方法是禁用此页面的事件验证,但您应该确保检查请求更改事件本身的用户的凭据,否则这是一个安全问题,因为用户将能够"按下"一个根本没有呈现的按钮(例如在他没有访问权限的产品上)。
你可以通过page指令禁用事件验证:
<%@ Page EnableEventValidation="false" ... %>
我相信也可以将更新面板的更新模式设置为always而不是有条件的,这可能会解决问题(您可以尝试并告诉我们吗?),但这会增加通过网络发送的数据。如果这是一个好的权衡取决于您的用例,取决于页面上的更新面板的数量和大小(越多越糟)。如果它是一个内部应用程序,或者这个UI访问相对较少,我会采用这种方法(假设它有效,因为我没有验证过)。
顺便说一句,这实际上不是一个脚本错误。您会得到客户端脚本错误,因为错误是通过AJAX请求出现的。这纯粹是由于您的代码存在潜在的安全问题而引发的服务器错误。
在页面顶部添加<%@ Page EnableEventValidation="false" %>
一旦创建了动态下拉列表,您必须在每个页面初始化或页面加载上重新创建它们或任何动态创建的控件。在这种情况下,您不需要使用EnableEventValidation="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
}
或者直接将GenerateProductUI(ProfileID)
从Page_Load
移到Page_Init