自定义验证程序消息未显示

时间:2014-06-18 04:49:18

标签: asp.net validation twitter-bootstrap webforms visual-studio-2013

  • VS2013,WebForms,.NET 4.51

我有一个FormView定义,在我的EditTemplate中我有如下:

 <div class="form-group">
    <asp:Label ID="lblClientClassification" CssClass="col-md-2 control-label" runat="server" for="cblClientClassifications" Text="Kind"></asp:Label>
     <div class="col-md-5">
         <asp:CheckBoxList ID="cblClientClassifications" runat="server"></asp:CheckBoxList>
         <asp:CustomValidator ID="cfvClientKinds" runat="server" Display="Dynamic" CssClass="label label-danger" ErrorMessage="XXXX" ValidationGroup="Default" OnServerValidate="cfvClientClassifications_OnServerValidate"></asp:CustomValidator>
 </div>

然后在后面的代码中:

    protected void cfvClientClassifications_OnServerValidate(object aSource, ServerValidateEventArgs aArgs)
    {
        CustomValidator cvCheckBoxKinds = aSource as CustomValidator;
        int checkedCount = 0;
        if (cvCheckBoxKinds != null)
        {
            CheckBoxList cblClientClassifications = GuiClientClassificationsFind();
            foreach (ListItem listItem in cblClientClassifications.Items)
            {
                if (listItem.Selected)
                {
                    checkedCount++;
                }
            }

            if (checkedCount == 0)
            {
                aArgs.IsValid = false;
                cvCheckBoxKinds.ErrorMessage = "Select client kind.";
            }
        }
    }

OnServerValidate正在触发,我将验证器设置为无效以及设置错误消息(Page.IsValid也按预期方式为false)。但是,错误文本未显示。当我查看页面源时,我看到:

<span id="ctl00_cphMainContent_fvData_cfvClientKinds" class="label label-danger" style="display:none;">XXXX</span>

而不是我设置的错误消息以及它不可见的事实。

有没有人在这里有关于如何追踪这个的指示?我已经看过类似的SO问题,但似乎没有任何评论适用。这可能与FormView有关吗?

2 个答案:

答案 0 :(得分:0)

在没有CssClass的情况下尝试控制=&#34;标签label-danger&#34;首先是bootstrap,然后使用下面的代码检查你的框:

    protected void cfvClientKinds_ServerValidate(object aSource, ServerValidateEventArgs aArgs)
    {
        aArgs.IsValid = cblClientClassifications.SelectedItem != null;
        cfvClientKinds.ErrorMessage = "Hey! this is a new message";
    }

我想你在解雇上述事件之前调用此行:

    protected void btnValidate_Click(object sender, EventArgs e)
    {
        Page.Validate();
    }

答案 1 :(得分:0)

简而言之,我认为您的问题要么与您查找cblClientClassifications checkBoxList的方式或您上面没有说明的其他代码有关。

CheckBoxList cblClientClassifications = GuiClientClassificationsFind();

我决定尝试你的案例并创建一个新的webform添加了formview并将其绑定到northwind类别表然后在edititemtemplate里面我添加了一个checkboxlist并手动填充它。添加了CustomValidator,双击它复制了你的代码隐藏,除了findcontrol部分外,它对我有用:GuiClientClassificationsFind(); 这是形式视图:

<asp:FormView ID="FormView1" runat="server" DataKeyNames="CategoryID" DataSourceID="SqlDataSource1">
    <EditItemTemplate>
        ...
        <asp:CheckBoxList ID="cblClientClassifications" runat="server">
            <asp:ListItem>Bir</asp:ListItem>
            <asp:ListItem>iki</asp:ListItem>
            <asp:ListItem>Üç</asp:ListItem>
            <asp:ListItem>Dört</asp:ListItem>
        </asp:CheckBoxList>
        <asp:CustomValidator ID="cfvClientKinds" runat="server" Display="Dynamic" CssClass="label label-danger" ErrorMessage="CustomValidator" OnServerValidate="cfvClientKinds_ServerValidate"></asp:CustomValidator>
        <br />
        <asp:LinkButton ID="UpdateButton" runat="server" CausesValidation="True" CommandName="Update" Text="Update" />
        &nbsp;<asp:LinkButton ID="UpdateCancelButton" runat="server" CausesValidation="False" CommandName="Cancel" Text="Cancel" />
    </EditItemTemplate>
</asp:FormView>

代码隐藏代码:

protected void cfvClientKinds_ServerValidate(object aSource, ServerValidateEventArgs aArgs)
        {
            CustomValidator cvCheckBoxKinds = aSource as CustomValidator;
            CheckBoxList cblClientClassifications = (CheckBoxList)FormView1.FindControl("cblClientClassifications");
            int checkedCount = 0;
            if (cvCheckBoxKinds != null)
            {
                foreach (ListItem listItem in cblClientClassifications.Items)
                {
                    if (listItem.Selected)
                    {
                        checkedCount++;
                    }
                }

                if (checkedCount == 0)
                {
                    aArgs.IsValid = false;
                    cvCheckBoxKinds.ErrorMessage = "Select client kind.";
                }
            }
        }

我Ali Shahrokhi的方法更短,效果和你的一样..

protected void cfvClientKinds_ServerValidate(object aSource, ServerValidateEventArgs aArgs)
        {
            CustomValidator cvCheckBoxKinds = aSource as CustomValidator;
            CheckBoxList cblClientClassifications = (CheckBoxList)FormView1.FindControl("cblClientClassifications");
            aArgs.IsValid = cblClientClassifications.SelectedItem != null;
            cvCheckBoxKinds.ErrorMessage = "Select client kind.";
        }

如果你在formview中输入edititemtemplate进行检查,你会在提交之前看到你的customvalidators span就像你提到的那样,因为服务器还没有以某种方式将它发送到客户端。