2009-08-25 5 views
0

텍스트 상자에 ASP.NET 정규식 검사기를 사용하는 데 문제가 있습니다. 나는 NullReferenceException이가 던져 어디 "ERROR"를 표시정규식 Validate() yield NullReference (ASP.NET)

RegularExpressionValidator regex = new RegularExpressionValidator(); 
regex.ID = "TextBoxRegExValidator" +  ((AVPEditControl)avpControl).ThisFieldRID.ToString(); //random name 
regex.ControlToValidate = ((AVPEditControl)avpControl).TextControlID; //this is valid. 
regex.ValidationExpression = "\d{3}-\d{2}-\d{4}"; 
regex.Text = "epic fail"; 
//later, in an event handler 
regex.Display = ValidatorDisplay.None; 
regex.ErrorMessage = ""; 
regex.Validate(); //ERROR 
bool valid = AVPEdit.Validator.IsValid; 

인가 : 이 내 코드의 압축 된 버전입니다. 내가 여기서 뭘 놓치고 있는지 모르겠다. 왜냐하면 정규 표현식이 그 문맥에서 null이 아니라는 것을 디버거로 확인했기 때문이다.

오류 메시지가 표시되는 방식에 대해 좀 더 정교하게 제어하고 싶습니다. 그래서 내가 정규식을 어떤 패널 등에 연결하지 않았는지를 확인했습니다.

왜 내가 null 참조를 얻고 있습니까? (.NET에서이 버그가 있습니까?)

또한 Visible을 0으로 설정하면 작동하지만 IsValid가 항상 true가되도록 설정합니다.

답변

2

모든 ASP.NET 유효성 검사기는 작동하려면 페이지의 일부 여야합니다. Validate 메서드는 값을 반환하지 않습니다. 이것은 사용하는 방식대로 사용되지 않기 때문입니다.

Validate 메서드 내부에서 ID를 기준으로 컨트롤을 조회하려고 시도하고 부모 명명 컨테이너가 없으면 컨트롤을 사용할 수 없습니다. 당신이하고있는 것처럼, 컨트롤을 찾을 수 없으므로 유효성을 검사 할 가치가 없습니다.

나는 다음 중 하나를 수행합니다 :

1) 다음, 영문의 검증을 넣어 자사의 검증 방법을 사용하고 나중에 IsValid 속성을 확인합니다. 표시를 없음으로 설정하면 UI에 표시되지 않아야합니다.

2) 그냥 정규식을 수동으로 실행하십시오. Regex.IsMatch를 사용하는 것보다 훨씬 많은 코드를 작성하고 있습니다.

+0

Regex를 사용하기 위해 바꿨습니다. 나는 C#이 정규 표현식의 기본 원리를 가졌음을 깨닫지 못했다. – Earlz

1

컨트롤 컬렉션에 추가해야한다고 생각합니다. 작동하지 않게하려면 보이지 않는 div 컨트롤 안에 있어야합니다.

그러나 프로그래밍 방식으로 텍스트 상자의 유효성을 검사하려는 경우 패턴을 사용하여 컨트롤을 확인하고 유효성을 반환하는 메서드를 작성하지 않는 이유는 무엇입니까?

+0

좋은 점은 아마도 그렇습니다. 하지만 전체 페이지가 동적으로 생성됩니다. div에 넣을 수는 없으며 컨트롤을 만들어서 페이지에 동적으로 추가해야합니다. 나는 (페이지에 붙어 있지 않은) Panel을 만들고 그 위에 validator를 추가하려고 시도했지만 아무것도하지 않았다. – Earlz

0

는 (그것이 컨트롤 컬렉션의 일부가되지 않고 null이 될 것입니다 무엇보다도 this.NamingContainer를 호출하려고 시도합니다 어디 반사경을 사용하는 경우, RegularExpressionValidator로 이동합니다, 당신은 볼 수 있습니다) 유효성 검사를 위해 코드를 사용하려는 경우 이와 비슷한 것을 사용할 수 있습니다.