ASP.Net级联下拉框和EnableEventValidation="false"

3
我刚刚使用AJAX Toolkit中的CascadingDropDown成功实现了SelectedIndexChanged,以便将所选值的查询字符串重定向到页面。我感到非常高兴!
但是,只有在页面上添加EnableEventValidation="false"才能使SelectedIndexChanged事件正常工作。问题是,CascadingDropDown将被放置在我的网站的MasterPage中作为产品选择器。
我不想在我的MasterPage中添加EnableEventValidation="false"!我查看了MSDN上的ClientScriptManager.RegisterForEventValidation方法,但是我完全不理解。
该怎么办?是否有使用ClientScriptManager.RegisterForEventValidation的简单示例?
谢谢...
编辑:这是代码:
<asp:ScriptManager ID="asm" runat="server" />
<div>
    Series:     <asp:DropDownList ID="SeriesList" runat="server" /><br />
    Printers:   <asp:DropDownList ID="PrinterList" runat="server" 
                 onselectedindexchanged="PrinterList_SelectedIndexChanged"
             AutoPostBack="True" /><br />
</div>

    <asp:CascadingDropDown ID="ccd1" runat="server"
        ServicePath="CascadingDropdown1.cs.asmx" ServiceMethod="GetSeries" 
        TargetControlID="SeriesList" Category="Series"
        PromptText="Select Series" />
    <asp:CascadingDropDown ID="ccd2" runat="server"
        ServicePath="CascadingDropdown1.cs.asmx" ServiceMethod="GetPrintersForSeries"
        TargetControlID="PrinterList" ParentControlID="SeriesList" Category="Printer" 
        PromptText="Select Printer" />

    <asp:UpdatePanel ID="UpdatePanel1" runat="server">

        <Triggers>
            <asp:AsyncPostBackTrigger ControlID="PrinterList" EventName="SelectedIndexChanged" />
        </Triggers>
    </asp:UpdatePanel>

这里是事件:

protected void PrinterList_SelectedIndexChanged(object sender, EventArgs e)
        {
            int printerID = Convert.ToInt32(PrinterList.SelectedValue);
            System.Web.HttpContext.Current.Response.Redirect("Default.aspx?PID="+printerID);
        }

你的下拉菜单里有什么样的文本?给我举几个例子。 - user191966
第一个ddl包含爱普生打印机系列名称,例如:Stylus、Stylus Colour、Stylus Photo。第二个ddl包含相应的型号编号,例如:BX535WD、DX4000、DX7400等。总共有8个系列和229台打印机。“Stylus Colour”是最长的系列名称。 - ComfortablyNumb
使用EnableEventValidation =“true”时,我会收到以下JScript运行时错误:Sys.WebForms.PageRequestManagerServerErrorException:无效的回发或回调参数。在配置中使用<pages enableEventValidation =“true”/>或<%@ Page EnableEventValidation =“true”%>在页面上启用事件验证。出于安全目的,此功能验证回发或回调事件的参数是否来自最初呈现它们的服务器控件。如果数据...等等! - ComfortablyNumb
@ Hari 我还应该指出,选择的值是整数 - 打印机ID。 - ComfortablyNumb
@ComfortablyNumb - 你尝试过在轻量级更新面板内使用常规下拉列表吗?如果你的页面已经优化,一些额外的异步回发不会有任何影响,并且可能会解决问题。当然,如果你的页面生命周期很昂贵,这不是一个好选择。 - Tim M.
显示剩余2条评论
1个回答

2
这个让人烦恼的问题的解决办法是自定义下拉菜单控件!
为了解决这个问题并帮助其他人解决,我做了以下步骤:
我创建了一个名为NoValidationDropDownList.cs的cs文件,并添加了以下代码。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI.WebControls;

namespace My.Namespace.Controls
{
    public class DdlNoEventValidation : DropDownList
    {
    }
}

然后在包含下拉控件的aspx页面上(在我的情况下是一个MasterPage),我放置了以下内容:

<%@ Register TagPrefix="asp" Namespace="My.Namespace.Controls" %>

接下来,我修改了级联下拉框,如下所示:

<p><asp:DdlNoEventValidation ID="DD1" runat="server" /></p>
<p><asp:DdlNoEventValidation ID="DD2" runat="server" 
   onselectedindexchanged="My_SelectedIndexChanged"
   AutoPostBack="True"
   /></p>

据我了解,创建一个自定义下拉控件可以绕过事件验证。这样一来,您就不需要为整个页面关闭事件验证。在我的情况下,由于控件位于MasterPage中,为整个站点关闭事件验证将是必须的!

遗憾的是,这不是我的原创作品,因此在此提供原始参考:http://johanleino.wordpress.com/2009/11/17/cascadingdropdown-casues-invalid-postback-or-callback-argument-error/

感谢Johan!

希望这能帮到您...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接