3

我有一个 CheckBoxList,我正在尝试验证是否至少选中了一个复选框。

标记:

<asp:CustomValidator ID="RequiredFieldValidator8" ValidationGroup="EditArticle"
    runat="server" ErrorMessage="At least one Category is required."
    OnServerValidate="topic_ServerValidate" />
<asp:CheckBoxList id="checkboxlistCategories" runat="server"></asp:CheckBoxList>

代码隐藏:

protected void topic_ServerValidate(object source, ServerValidateEventArgs args)
{
    int i = 0;
    foreach (ListItem item in checkboxlistCategories.Items)
    {
        if (item.Selected == true)
            i = i + 1;
    }
    if (i == 0)
        args.IsValid = false;
    else
        args.IsValid = true;
}

如果我在 CustomValidator 控件中添加 ControlToValidate="checkboxlistCategories",它就会爆炸!我得到的例外是:

System.Web.HttpException:控件“checkboxlistCategories”由“RequiredFieldValidator8”的 ControlToValidate 属性引用

我错过了什么吗?

4

5 回答 5

1

这是一个更简洁的jQuery实现,它允许一个ClientValidationFunction用于页面上任意数量的CheckBoxList控件:

function ValidateCheckBoxList(sender, args) {
 args.IsValid = false;

 $("#" + sender.id).parent().find("table[id$="+sender.ControlId+"]").find(":checkbox").each(function () {
     if ($(this).attr("checked")) {
  args.IsValid = true;
  return;
     }
 });
}

这是标记:

<asp:CheckBoxList runat="server"
    Id="cblOptions" 
    DataTextField="Text" 
    DataValueField="Id" />

<xx:CustomValidator Display="Dynamic" 
        runat="server" 
        ID="cblOptionsValidator"
        ControlId="cblOptions"
        ClientValidationFunction="ValidateCheckBoxList" 
        ErrorMessage="One selection required." />

最后,允许客户端函数通过 ID 检索目标控件的自定义验证器:

public class CustomValidator : System.Web.UI.WebControls.CustomValidator
{
 public string ControlId { get; set; }

 protected override void OnLoad(EventArgs e)
 {
     if (Enabled)
         Page.ClientScript.RegisterExpandoAttribute(ClientID, "ControlId", ControlId);

     base.OnLoad(e);
 }
}
于 2010-10-25T15:00:33.603 回答
0

只是一个建议,但您可以改用单选按钮并定义组名。这将消除验证 b/c 的需要,组内只能选中一个单选按钮。

于 2010-03-23T14:41:10.097 回答
0

也许我错过了一些东西。但CheckBoxList控制没有ValidationPropertyAttribute。因此,您不能将其用作ControlToValidate财产。尝试这个:

复选框列表.cs

[ValidationProperty("SelectedIndex")]
public class CheckBoxList : System.Web.UI.WebControls.CheckBoxList
{
}

网络配置

<tagMapping>
  <add tagType="System.Web.UI.WebControls.CheckBoxList, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" mappedTagType="Namespace.CheckBoxList, Assembly"/>
</tagMapping>

无论如何,Scott Mitchell 在这里写了一篇很棒的文章。

于 2010-03-23T14:46:41.513 回答
0

考虑到您的服务器端验证方法topic_ServerValidate专门绑定到该checkboxlistCategories字段,您不需要设置该ControlToValidate属性。

添加属性时它“爆炸”的原因是ControlToValidate 您引用的控件的类型 - a CheckBoxList. 将 a 分配ControlToValidate给任何类型的验证器时,该验证器将在执行实际验证逻辑之前自动对引用的控件进行“非空”检查。如果该字段为空,则不进行验证(即验证成功)。也就是说,当然,除非您设置ValidateWhenEmpty = true. 显然,验证器不知道如何检查 aCheckBoxList是否为空,而是抛出异常。

在您的特定情况下,CustomValidator实际上只是用作非空检查,即使引用的控件保持“空”,您也绝对希望验证器出现。正如我的回答的第一段所述,实现这一目标的最简单方法是删除有问题的 - 和不必要的 - 财产。

于 2010-03-23T14:26:52.503 回答
0

正如 Mehdi 提到的,4 Guys 在他在回答中链接到的文章中涵盖了这一点。

为简洁起见,这是代码清单-

public class CheckBoxListRequiredFieldValidator : BaseValidator
{
    private ListControl _listctrl;

    public CheckBoxListRequiredFieldValidator()
    {
        base.EnableClientScript = false;
    }

    protected override bool ControlPropertiesValid()
    {
        Control ctrl = FindControl(ControlToValidate);

        if (ctrl != null)
        {
            _listctrl = (ListControl)ctrl;
            return (_listctrl != null);
        }
        else
            return false;  
    }

    protected override bool EvaluateIsValid()
    {
        return _listctrl.SelectedIndex != -1;
    }
}

将此獾弹出到您的用户控件库中,然后离开。

HTH。

于 2010-06-17T11:27:44.443 回答