1

我希望我可以粘贴我的标记,但它太复杂并且包含很多对客户公司名称的引用。我希望有丰富经验的人能够指出我正确的方向。

我们有一个包含不属于验证组的 ValidationSummary 的母版页。在我们的内容页面上,我们有另一个 ValidationSummary,它分配给名为 ValReject 的验证组。在内容页面上还有一个使用 ClientValidationFunction 的 CustomValidator 和一个按钮,这两者也都分配给 ValReject。

当我单击按钮时,客户端函数执行一次,但错误报告给两个验证摘要,内容页面上的一个和母版页上的一个。我什至添加了第三个验证摘要并将其组设置为“asdf”之类的内容,但它也被报告给,这意味着所有三个验证摘要都在页面上显示相同的错误。

然后,我创建了一个单独的 ASP.NET 测试项目,将所有代码粘贴到其中,然后运行它,它会按照应有的方式进行验证。

然后我在内容页面上玩了 AutoEventWireup。当我将其设置为 false 时,验证有效,但页面加载事件不会触发。那是怎么回事?

我知道您可能需要代码示例,但是,就像我说的那样,如果不经历巨大的头痛,我就无法做到这一点(相信我,主页面和内容页面标记是巨大的。

这里的问题是:有没有人知道什么会导致单个验证器向页面上的所有验证摘要报告,即使其中只有一个验证器与验证器和按钮共享相同的验证组?

编辑:当我将标记粘贴到我的测试应用程序中时,我确实必须删除一些标签才能使其工作,因为测试应用程序没有对真实母版页使用的某些程序集的引用。我删除的一些内容是:

<%@ Register Assembly="RadMenu.Net2" Namespace="Telerik.WebControls" TagPrefix="radM" %>

<radM:RadMenu ID="RadMenu1" runat="server" DataSourceID="smdsMenu" Skin="CssGrey" ClickToOpen="True" EnableViewState="False" CausesValidation="false" />

因此,它在我的测试应用程序上工作的事实让我得出结论,我们正在我们的生产应用程序上做一些我在我的测试应用程序中没有做的事情。是的,我知道这很模糊,但也许一个灯泡会在某人的脑海中熄灭。

4

3 回答 3

3

伙计,经过几个小时的旋转,我终于弄明白了。我们使用这个扩展方法来禁用按钮的双击:

    public static void DisableDoubleClick(this Button Control)
    {
        System.Text.StringBuilder sb = new System.Text.StringBuilder();

        sb.Append("if (typeof(Page_ClientValidate) == 'function') { ");
        sb.Append("if (Page_ClientValidate() == false) { return false; }} ");
        sb.Append("this.disabled = true;");
        sb.Append(Control.Page.ClientScript.GetPostBackEventReference(Control, ""));
        sb.Append(";");
        Control.Attributes.Add("onclick", sb.ToString());
    }

这就是在调用全局验证时弄乱验证的原因。我通过进行以下更改来解决此问题:

        sb.Append(string.Format("if (Page_ClientValidate({0}) == false) {{ return false; }}}} ",
            Control.ValidationGroup == string.Empty ? string.Empty : string.Format("\"{0}\"", Control.ValidationGroup)));

当我将 AutoEventWireup 设置为 false 以查看会发生什么时,让我想到了这一点。这使页面加载事件不会触发,这是调用上述扩展方法的地方。大海捞针,这个问题。

我不会责怪任何人因为缺乏细节而没有回答,但我会保持这个状态,以防其他人可以使用它。

编辑:感谢 slfan 和 gbs。当我看到你们两个基本上从问题的两个方面解决我的问题时,我刚刚发现了这个问题并回到这里发布我的答案。页面加载事件是发生绑定的地方,并且被调用的扩展方法会弄乱 Page_ClientValidate 函数。既然你们俩在技术上都是正确的,我不能给你们两个答案,我希望如果我在这里标记我自己的答案,没有人会不高兴。你们两个绝对擅长用最少的细节和没有代码示例来分析此类问题。道具。

于 2011-05-20T19:34:14.800 回答
1

AutoEventWireup 使 ASP.NET 自动调用 Page_Load 事件,而无需注册到事件。另一种方法是覆盖 OnLoad 方法。当不调用 Page_Load 时,您的页面似乎可以正常工作。你在这个方法中做了什么?一些奇怪的数据绑定?如果你取消注释这段代码,它会起作用吗?像这样,您可以将问题缩小到您未在问题中显示的真正问题。

于 2011-05-20T19:03:41.140 回答
1

我会寻找两件事:

1:使用 Page_ClientValidate 的任何外部验证都在 javascript 中完成

2:在代码隐藏中对 Page.Validate() 的任何显式调用

于 2011-05-20T19:18:58.683 回答