2010-03-23 3 views
3

하나 이상의 확인란이 선택되어 있는지 확인하려고하는 CheckBoxList가 있습니다.asp : CustomValidator/OnServerValidate

마크 업 :

<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> 

코드 숨김은 :

내가 직접 CustomValidator 컨트롤의 ControlToValidate = "checkboxlistCategories"를 추가하면
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; 
} 

, 그것은 불면! 내가 얻을 수는 예외입니다 :

System.Web.HttpException : 'RequiredFieldValidator8'

나는 실종 뭔가의 ControlToValidate 속성에 의해 참조 제어 'checkboxlistCategories'?

+0

"폭발"에 대한 설명을 추가 할 수 있습니다. 일부 오류 메시지가 표시되면 질문에 추가하면 동일한 문제가 발생할 때 다른 사용자가이 페이지를 찾을 가능성이 높아집니다. –

+0

예외는 다음과 같습니다. System.Web.HttpException : 'RequiredFieldValidator8'의 ControlToValidate 속성에 의해 참조되는 컨트롤 'checkboxlistCategories'의 유효성을 검사 할 수 없습니다. – Neil

답변

0

서버 측 유효성 검사 방법 topic_ServerValidate이 필드에만 적용된다는 점을 감안하면 ControlToValidate 속성을 설정할 필요가 없습니다.

속성을 추가 할 때 "불면"하는 이유는 참조하는 컨트롤의 유형입니다 (CheckBoxList). 모든 유효성 검사기에 ControlToValidate을 할당하면 해당 유효성 검사기는 실제 유효성 검사 논리를 수행하기 전에 참조 된 컨트롤에서 "비어 있지 않은"검사를 자동으로 수행합니다. 입력란이 비어 있으면 유효성 검사가 수행되지 않습니다 (즉 유효성 검사 성공). 그건 물론, ValidateWhenEmpty = true을 설정하지 않는 한입니다. 분명히 유효성 검사기는 CheckBoxList이 비어 있는지 확인하는 방법을 모르고 대신 예외를 throw합니다.

특정 경우에 CustomValidator이 실제로 비어 있지 않은 검사로 사용되는 경우 참조 된 컨트롤이 "비어있는"상태 일 때에도 유효성 검사기를 원할 것입니다. 내 답변의 첫 번째 단락에 명시된 바와 같이,이를 달성하는 가장 간단한 방법은 불쾌감을주는 불필요한 속성을 제거하는 것입니다.

+0

ControlToValidate = "checkboxlistCategories"없이 시도한 경우 OnServerValidate 메서드가 실행되지 않습니다. – Neil

+0

@Neil : 정말입니까? 나는'CustomValidator' (오직'ServerValidate' 이벤트 핸들러 세트 만있는),'CheckBoxList'와'Button'을 포함하는 트리밍 된 폼으로 테스트했습니다. 버튼을 클릭하면 여기에서 유효성 검사 이벤트 핸들러가 실행됩니다. –

+0

if (! IsPostBack)의 page_load에 Page.Validate()를 추가하고 OnServerValidate 이벤트가 발생할 때마다 (IsPostBack) 또는 버튼 클릭 이벤트에서 발생하지 않습니다. – Neil

0

그냥 제안하지만 라디오 버튼을 대신 사용할 수 있으며 그룹 이름을 정의 할 수 있습니다. 이렇게하면 유효성 검사 b/c가 필요 없으며 그룹 내에서 하나의 라디오 버튼 만 확인할 수 있습니다.

+0

질문에있는 코드는 ** 하나 이상의 ** 체크 박스가 선택되면'IsValid'를 설정합니다. 라디오 버튼은 언제든지 하나만 선택하도록 허용합니다. –

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> 

어쨌든 스콧 미첼이 here에 대한 좋은 기사를 작성했습니다.

1

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; 
    } 
} 

팝 사용자가 라이브러리를 제어하고 멀리 당신이 가서 당신에이 오소리 listing- 코드입니다.

HTH.

1

여기 페이지에 CheckBoxList 컨트롤의 수에 대해 하나의 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); 
} 
}