ASP.NET 3.5验证组无法正常工作

时间:2011-05-20 16:59:09

标签: asp.net validation validationgroup

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

我们有一个包含ValidationSummary的母版页,该母版页不属于验证组。在我们的内容页面上,我们有另一个ValidationSummary,它被分配给一个名为ValReject的验证组。在内容页面上还有一个CustomValidator,它使用ClientValidationFunction和一个按钮,这两个按钮也分配给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" />

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

3 个答案:

答案 0 :(得分: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函数。既然你们在技术上都是对的,我也不能给你们两个答案,我希望如果我把自己标记为答案,没有人会感到沮丧。你们两个肯定善于用最少的细节和没有代码样本来分析这些问题。道具。

答案 1 :(得分:1)

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

答案 2 :(得分:1)

我会寻找两件事:

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

2:在代码隐藏

中对Page.Validate()的任何显式调用