asp:DropDownList - 通过JavaScript / jQuery添加选项时无效的回发或回调参数

时间:2009-11-11 12:25:11

标签: asp.net javascript jquery

我有两个下拉列表:

<asp:DropDownList ID="Field_Type" runat="server" />
<asp:DropDownList ID="Field_SubType" runat="server" />

Field_Type是数据绑定,带有从数据库填充的类型列表。 Field_SubType更改后,通过jQuery / AJAX设置Field_Type。然后我使用$("#<%# Field_SubType.ClientID %>").append("<option value=\"1\">Test</option>");添加一个选项。这按预期工作(我看到添加了新的子类型)。

但是,在选择已添加的选项后回发时,我收到错误:

  

无效的回发或回调参数。使用配置或&lt;%@ Page EnableEventValidation =“true”%&gt;启用事件验证在一个页面中。出于安全考虑,此功能可验证回发或回调事件的参数是否来自最初呈现它们的服务器控件。如果数据有效且符合预期,请使用ClientScriptManager.RegisterForEventValidation方法注册回发或回调数据以进行验证。

这可能是什么原因,我怎么能绕它呢?我有一些想法:

  1. 使用普通<select>并使用Request.Form - 如果在页面上多次使用的用户控件中可能会出现问题
  2. 使用所有子类型填充Field_SubType,过滤掉那些不属于Field_Type子类型的子类型 - 这将加载超出要求的数据,这将增加页面加载时间
  3. 还有其他选择吗?

2 个答案:

答案 0 :(得分:3)

原因是默认情况下,ASP.NET会验证每个表单字段中提交的值是否是最初发送到页面的值。这是一个例子:

我们有一个带有3个选项的DropDownList - A,B和C. ASP.NET知道这些,因为我们是从ASP.NET代码中添加它们的。在JavaScript中,我们添加了第四个选项,D。ASP.NET不知道那个,因为它发生在客户端。当我们提交页面时,如果选择了D,ASP.NET会说“D不是我给你的选择之一。你可能会恶意地试图操纵请求中的帖子值。”它通过在那里中止请求来保护系统和开发人员。

您可以关闭页面验证 - 在相关页面上,如错误消息所示,或者对于web.config级别的所有页面:

<system.web>
   <pages enableEventValidation="false"/>
</system.web>

如果您编写代码时,并不总是需要事件验证,以至于您根本不会根据表单中提交给您的值直接采取明确的操作(您绝不应该这样做)。应忽略来自用户的意外或超出范围的值,或者使您不执行任何操作。只要您以这种方式编写代码,就可以安全地关闭事件验证。

答案 1 :(得分:2)

如果您使用尚未裁剪的文本加载下拉列表,也可能会出现这种情况。我从XML加载了一个下拉列表,它在项目中放置了换行符和空格。然而,当下拉出现时,一切看起来都很好。更改下拉列表后,我收到了错误消息。

添加修剪解决了问题:

items.Add(item2.Value.Trim());
相关问题