3

チェックボックスの少なくとも1つがチェックされていることを検証しようとしている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;
}

ControlToValidate="checkboxlistCategories" を CustomValidator コントロールに追加すると、爆発します。私が得る例外は次のとおりです。

System.Web.HttpException: コントロール 'checkboxlistCategories' が 'RequiredFieldValidator8' の ControlToValidate プロパティによって参照されています

何か不足していますか?

4

5 に答える 5

1

これは、ページ上の任意の数のCheckBoxListコントロールに対して1つのClientValidationFunctionを許可するよりクリーンなjQuery実装です。

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

Mehdiが述べたように、4人の男は彼が彼の答えでリンクしている記事でこれをカバーしました。

簡潔にするために、ここにコードリストがあります-

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 に答える
0

単なる提案ですが、代わりにラジオ ボタンを使用してグループ名を定義することもできます。これにより、グループ内で 1 つのラジオ ボタンのみをチェックできるため、検証の必要がなくなります。

于 2010-03-23T14:41:10.097 に答える
0

サーバー側の検証方法topic_ServerValidateが特にフィールドに関連付けられていることを考慮すると、プロパティcheckboxlistCategoriesを設定する必要はありません。ControlToValidate

プロパティを追加すると「爆破」される理由ControlToValidate は、参照しているコントロールのタイプ - aCheckBoxListです。を任意の種類のバリデーターに割り当てるとControlToValidate、そのバリデーターは、実際の検証ロジックを実行する前に、参照されたコントロールに対して「空でない」チェックを自動的に実行します。フィールドが空の場合、検証は行われません (つまり、検証成功)。もちろん、設定しない限りですValidateWhenEmpty = true。どうやら、バリデーターは a が空かどうかをチェックする方法を知らずCheckBoxList、代わりに例外をスローします。

CustomValidator実際に空でないチェックとして機能する特定のケースでは、参照されたコントロールが「空」のままであっても、バリデーターが発生することを明確に望んでいます。私の回答の最初の段落で述べたように、これを達成する最も簡単な方法は、問題のある、不要なプロパティを削除することです。

于 2010-03-23T14:26:52.503 に答える
0

多分私は何かが足りない。しかし、CheckBoxListコントロールにはValidationPropertyAttribute. ControlToValidateしたがって、それをプロパティとして使用することはできません。これを試して:

CheckBoxList.cs

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

Web.Config

<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 に答える