允许带有有效数据的webpart保存,同时显示其他webpart的验证错误

时间:2012-03-01 19:45:58

标签: c# asp.net validation web-parts requiredfieldvalidator

我有一个ASP.Net页面,由几个Web部件组成(C# - ascx)。根据定义,我不知道页面上有多少Web部件。我不控制页面,只有我的部分恰好被添加到此页面。其他作者可能在同一页面上有部分内容,但现在这并不重要。

大多数网页部件用于显示和编辑信息。每个这样的部分都有自己的ValidationGroup和ValidationSummary,以及它自己的Save按钮。当前要求要求单独保存每个部件。这些部分可以全部相同或仅从三种变体中选择,但配置为显示来自数据库的不同数据子集。每个部分可能都有必填字段,使用RequiredFieldValidator。

另一种类型的Web部件用作标题/摘要。它几乎总是会出现一次,虽然它可能出现在页面的任何地方或(可能)出现不止一次。

我想要做的是在标题中显示摘要,页面上的哪些其他部分有未满足的要求。 (这将包括到相应部分的跳转链接,但我知道如何做到这一点。)来自标题部分的这段代码让我确定是否有任何部分有验证错误:

bool foundAnyInvalid = false;
Dictionary<string, bool> Parts = new Dictionary<string, bool>();
foreach (System.Web.UI.WebControls.BaseValidator val in Page.Validators)
{
    if (!Parts.ContainsKey(val.ValidationGroup))
    {
        Parts.Add(val.ValidationGroup, true);
        Page.Validate(val.ValidationGroup);
    }
    if (!val.IsValid)
    {
        Parts[val.ValidationGroup] = false;
        foundAnyInvalid = true;
    }
}

...但它会强制立即验证所有部件。因此,如果其他部件的要求失败,则无法保存单个部件。

我想要实现的目标是:

  • 标题始终显示缺少验证的部分列表

  • 所有细节部分都会显示所需字段旁边的典型红色*

  • 如果单击“保存在特定详细信息”部分,该部分的Validator.Message和ValidatorSummary将显示典型消息。 (“需要Foo”)

  • 如果用户在有效的部件上单击“保存”,即使其他部件仍然缺少数据,数据也应保存。

作为次要且有些相关的问题,标题包含“返回”链接。只要任何部分无效并保存,我想禁用此链接。如果在一个问题中这个问题太多了,我会另外问一下,但我想我应该提一下,以防它影响所提供的答案。 (我可能必须通过检查数据库而不是表单来验证这个。)

如果单击任何“保存”按钮,我会考虑保存所有部件,但我不能立即确定如何执行此操作。如果我以错误的方式来到这个页面,请不要犹豫告诉我。

1 个答案:

答案 0 :(得分:0)

您是否尝试将ValidationGroup设置为独特的内容?

我没有尝试过这个用于Web部件,但是对于单个ASPX页面,您可以使用ValidationGroup来触发不同的验证。

    <asp:TextBox runat="server" ID="textbox1" ValidationGroup="uniqueForThisPageValGroup1" />
    <asp:RequiredFieldValidator runat="server" ID="RequiredFieldValidator1" ValidationGroup="uniqueForThisPageValGroup1" ControlToValidate="textbox1" SetFocusOnError="True" ErrorMessage="Requires a value." /><br />
    <asp:Button runat="server" ID="button1" Text="Submit" ValidationGroup="uniqueForThisPageValGroup1" /><br />

    <hr />

    <asp:TextBox runat="server" ID="textbox2" ValidationGroup="uniqueForThisPageValGroup2" />
    <asp:RequiredFieldValidator runat="server" ID="RequiredFieldValidator2" ValidationGroup="uniqueForThisPageValGroup2" ControlToValidate="textbox2" SetFocusOnError="True" ErrorMessage="Requires a value." /><br />
    <asp:Button runat="server" ID="button2" Text="Submit" ValidationGroup="uniqueForThisPageValGroup2" /><br />

将其添加到ASPX页面并尝试单击不同的“提交”按钮,您将看到它仅对匹配ValidationGroup的那些按钮执行验证。