2

我使用 2 requiredfiledvalidator 进行 2 次选择,一个正在工作,但第二个(我需要的)不是:

    <asp:dropdownlist id="ddlMod" runat="server" Width="235px" AutoPostBack="True" Font-Names="Arial" Font-Size="XX-Small">
</asp:dropdownlist>
<asp:requiredfieldvalidator id="RequiredFieldValidator1" runat="server" Font-Names="Arial" Font-Size="XX-Small"
ErrorMessage="Select Mod" InitialValue="00" Display="Dynamic" ControlToValidate="ddlMod">
</asp:requiredfieldvalidator>

<asp:dropdownlist id="ddlInd" runat="server" Width="235px" AutoPostBack="True" Font-Size="XX-Small">
</asp:dropdownlist>
<asp:requiredfieldvalidator id="RequiredFieldValidator2" runat="server" Font-Names="Arial" Font-Size="XX-Small"
ErrorMessage="Select Ind" InitialValue="0" Display="Dynamic" ControlToValidate="ddlInd">
</asp:requiredfieldvalidator>

如果我选择第二个,我可以看到第一个的错误消息。但是,如果我不选择任何消息或选择第一个消息,我将看不到任何消息。

4

1 回答 1

0

AutoPostBack="true"我相信这是在下拉列表中使用该属性的已知 asp.net 限制。该AutoPostBack属性否定验证过程并回发。

作为一个简单的解决方法,您可以通过修改页面加载事件使验证在回发期间发生:

protected void Page_Load(object sender, EventArgs e)
{
    if(Page.IsPostBack)
        Page.Validate();
}

这将导致验证在某种情况之后仍然发生AutoPostBack。如果下拉列表值不正确,页面将刷新并按预期显示错误消息。缺点是屏幕会闪烁等,但唯一的另一个选择是为每个DropDownList控件添加自定义客户端验证脚本,我个人认为这不值得。

使用上面的代码,请记住,当页面自动回发时,它实际上可能是无效的——但您可能调用的其他方法可能期望一个有效的页面。使用该Page.IsValid属性来防止这种情况。(Page.IsValid无论如何,对于经过验证的表单,使用实际上是最佳实践。)

例子:

protected void Page_Load(object sender, EventArgs e)
{
    if(Page.IsPostBack)
        Page.Validate();

    ddlMod.SelectedIndexChanged += new EventHandler(ddlMod_SelectedIndexChanged);

    if(Page.IsValid)
    {
        //load some data; do some things...
    }
}

protected void ddlMod_SelectedIndexChanged(object sender, EventArgs e)
{
    if(Page.IsValid)
    {
        //do some stuff if the page validated
    }
}

最后一点- 您需要确保Page.Validate()在页面生命周期的早期被调用(Page_Load这是一个好点),就好像您引用Page.IsValid并且Validate()尚未被调用一样,Page.IsValid抛出一个严重的异常......

如果您想摆脱自动回发的闪烁,您还可以使用 ajaxUpdatePanel使用户无缝连接。

希望这可以帮助!

于 2010-02-24T19:48:57.707 回答