2012-05-10 4 views
1

previous question에 대한 사용자 지정 컨트롤 및 유효성 검사를 수행하면 서버 측 유효성 검사가 작동하지만 클라이언트 측 유효성 검사를 추가하는 방법을 파악할 수 없습니다. 나는 다음과 같은 컨트롤이 있습니다클라이언트 측에서 사용자 정의 컨트롤의 유효성을 검사하는 방법은 무엇입니까?

나는이 컨트롤을 추가 내 웹 양식에
[ValidationProperty("Text")] 
[ToolboxData("<{0}:DateSelect runat=server></{0}:DateSelect>")] 
public class DateSelect : System.Web.UI.WebControls.Panel 
{ 
private DropDownList day; 
private DropDownList month; 
private DropDownList year; 

public DateSelect() 
{ 
    day = new DropDownList(); 
    /* some code to create items for 'day' here */ 
    Controls.Add(day); 
    month = new DropDownList(); 
    /* some code to create items for 'month' here */ 
    Controls.Add(month); 
    year = new DropDownList(); 
    /* some code to create items for 'year' here */ 
    Controls.Add(year); 
} 


public string Text 
{ 
    get 
    { 
     return year.Text + "-" + month.Text + "-" + day.Text; 
    } 
} 
} 

가 유효한 날짜에 대해 확인하기 위해 데이터 형식 작업에 CompareValidator를 추가합니다. 유효성 검사기의 EnableClientScriptfalse으로 설정하고 사용자 지정 컨트롤의 유효성을 서버 쪽에서 잘 확인하고 올바른 경우 올바른 메시지를 제공합니다. 그러나 EnableClientScripttrue으로 지정하자마자 사용자 지정 컨트롤은 클라이언트 쪽의 유효성을 검사하고 DropDownLists에 유효한 날짜가 실제로있을 때 오류 메시지를 생성합니다.

function ValidatorGetValueRecursive(control) 
{ 
    if (typeof(control.value) == "string" && (control.type != "radio" || control.checked == true)) { 
     return control.value; 
    } 
    var i, val; 
    for (i = 0; i<control.childNodes.length; i++) { 
     val = ValidatorGetValueRecursive(control.childNodes[i]); 
     if (val != "") return val; 
    } 
    return ""; 
} 

그래서 내가 뭔가를 추가해야 생각 : 내가 정확한 값의 결과로 올 것 결코 생각 그물에 의해 생성 된 다음 자바 스크립트에서 결국 이유를 알아 내기 위해 노력했습니다 유효성 검사기가 내 컨트롤의 유효성 검사를 시도하고 세 개의 DropDownLists의 선택된 항목에서 유효성을 검사하는 올바른 값을 생성하자 마자 호출되는 javascript의 맞춤 컨트롤입니다. 나는이 스크립트를 추가 할 수있는 단서가 없다. 어떤 포인터?

답변

1

컨트롤에는 실제로 여러 서버 컨트롤이 포함되어 있으므로 다른 컨트롤과 마찬가지로 클라이언트 쪽 유효성 검사기를 컨트롤 컬렉션에 추가하는 것이 좋습니다.

var ddl = new DropDownList(); 
ddl.ID = "ddlDay"; 
Controls.Add(ddl); 

var validator = new RequiredFieldValidator(); 
val.ControlToValidate = ddl.ID; 
val.ErrorMessage = "*"; //property to set this for all validators 
val.Display = ValidatorDisplay.Dynamic; //property to set this for all validators 
Controls.Add(validator); 

유효성 검사기를 추가 한 후에는 컨트롤의 유효성 검사기, 모두에 적용 할 속성을 노출 수 등을 검증 그룹, 오류 메시지, 디스플레이 유형,

편집 # 1

같은

결합 된 입력을 하나로 확인하려면 을 사용하고 컨트롤을 통해 필요한 클라이언트 스크립트를 등록하십시오.

나는 이것을 전혀 테스트하지 않았지만, 아래에 개념을 설명하는 간단한 코드 예제가 있습니다. 물론, 당신은 StringBuilder 또는 무언가를 사용하여 코드의 유효성 검사 기능을 구축 할 것입니다 :

여기
<script type="text/javascript"> 
    clientValidate = function(source, args){ 

     var ddl1 = document.getElementById("<%= ddl1.ClientID %>"); 
     var ddl2 = document.getElementById("<%= ddl2.ClientID %>"); 

     if (ddl1.options[e.selectedIndex].value.length == 0) 
      args.IsValid = false; 
     if (ddl2.options[e.selectedIndex].value.length == 0) 
      args.IsValid = false; 

    } 
</script> 
<asp:CustomValidator ID="MyCustomValidator" runat="server" 
    ErrorMessage="Invalid" 
    ClientValidationFunction="clientValidate" /> 

의 클라이언트 측 유효성 검사에 대한 사용자 지정 유효성 검사기를 사용하는 방법을 설명하는 몇 가지 기사입니다

편집 # 2

좀 더 자세한 내용은 CustomValidator이 복합 컨트롤과 호환되어야한다는 것을 보여줍니다.

+0

오케이, 나는 당신이 말하는 것을 이해하지만 이것이 어떻게 클라이언트 쪽 유효성 검사기가 3 DropDownList의 선택한 항목을 날짜로 조합하여 유효성을 검사하게합니까? 또한 현재 설정에서 서버 측 유효성 검사가 올바르게 작동합니다. – Bazzz

+0

결합 된 입력이 유효성 검사를하려는 경우 'CustomValidator'를 사용하고 유효성 검사를 수행하는 데 필요한 클라이언트 스크립트를 사용자 컨트롤에 삽입하십시오. –

+0

귀하의 요점을 이해하지만 다른 방식으로 문제에 접근하는 것을 선호합니다. 즉, CompareValidator가 작동하는 방식으로 사용자 정의 컨트롤을 적용하는 것입니다. 그 이유는 모든 컨트롤과 유효성 검사기가 데이터베이스가 기대하는 필드와 데이터 유형을 기반으로 동적으로 생성되기 때문입니다. 나는 당신의 솔루션이 가능하다고 생각하지만 CompareValidator가 서버 측에서 작동하기 때문에 클라이언트 측에서 작동하도록 만드는 것이 가능해야한다고 생각한다. – Bazzz

관련 문제