동적 제어 C#에 대한 검증기 악몽
-
21-08-2019 - |
문제
마스터에서 생성 된 페이지의 콘텐츠 영역의 웹 사용자 컨트롤 내부에 동적으로 생성 된 식탁보의 동적으로 만든 텍스트 상자에 필요한 필드 바리 디터 및 regularexpressionvalidator를 추가해야 할 필요가 있습니다.
아마도 당신이 추측 할 수 있듯이 문제는 동적으로 생성 된 텍스트 상자를 보도록 ControlTovalidate 속성을 동적으로 설정하려고합니다.
일부 연구 후 코드는 다음과 같습니다.
- 패널을 만듭니다 (내가 컨트롤 테이 도티 네이트와 유효성 검사기가 동일한 컨테이너 내에 있어야한다고 들었을 때). 이것은 원래 자리 표시 자 였지만 아래에 나열된 제안을 시도했습니다.
- 텍스트 상자를 생성하고 ID를 설정합니다.
- 텍스트 상자를 패널에 추가합니다.
- 필수 필드 밸리 디터를 만듭니다.
ControlTovalidate의 ID를 설정합니다. 내가 사용하려고 시도한 값 :
- 컨트롤의 ID
- 컨트롤의 클라이언트
- 추가 된 텍스트에 의해 접두사가 접두사의 ID가 서버가 웹 사용자 컨트롤의 자식 제어에 추가됩니다.
- 클라이언트 ID도 같은 방식으로 수정되었습니다
- 컨트롤의 이름 (Off Chance)
- 서버가 컨트롤 이름에 추가되는 텍스트에 의해 접두사의 이름이 있습니다.
- 새로운 제어 객체를 TextBox에 캐스팅 한 다음 ID 및 ClientID를 사용하기 위해 맞춤형 재귀 FindControl 메소드 사용
- 통제의 고유 한
- 위에서 설명한 것과 같은 접두사로 동일한 수정
- 유효성 검사기를 패널에 추가하십시오.
- 패널을 식탁보에 추가하십시오.
말할 것도없이 나는 여전히 검증기가 검증해야 할 제어를 "확인"하도록 설득 할 수 없으며 문제에 접근하는 새로운 방법이 완전히 벗어났습니다.
편집 : 추가 탐정 작업으로 인해 Page_Load 이벤트가 끝날 때까지 페이지가 문제가되지 않는 시점으로 이어졌습니다. 페이지 구축을위한 코드가 완료된 후 서버는 문제가있는 것 같습니다. 너무 일찍 대신 너무 늦게 이름 지정 컨테이너에 컨트롤을 추가하고 있는지 궁금해하기 시작했습니다.
제안이 있습니까?
해결책
TextBox와 두 유효성 검사기가 포함 된 사용자 컨트롤을 작성하는 것은 어떻습니까? 그런 다음 설정할 수 있습니다 ControlToValidate
평소와 같이 Visual Studio를 통해이 새로운 컨트롤을 동적으로 동적으로 추가합니다.
다른 팁
비슷한 상황에서 리피터를 사용했습니다.
<table>
<colgroup>
<col style="white-space: nowrap;" />
<col />
<col />
</colgroup>
<asp:Repeater ID="InputFields" runat="server">
<ItemTemplate>
<tr>
<td class="labelCell">
<asp:Label id="FieldName" runat="server" Font-Bold="True" Text='<%# Eval("Name") %>'></asp:Label>:
</td>
<td class="fieldCell">
<asp:TextBox id="FieldData" runat="server" autocomplete="off" />
</td>
<td class="errorCell">
<asp:RequiredFieldValidator ID="FieldNameRequiredValidator" runat="server" CssClass="errorValidator" ErrorMessage='<%# Eval("Name") %> is required'
ControlToValidate="FieldData" Display="Dynamic"> </asp:RequiredFieldValidator>
<asp:RegularExpressionValidator ID="FieldNameRegexValidator" runat="server" CssClass="errorValidator" ErrorMessage='A valid <%# Eval("Name") %> is required'
ControlToValidate="FieldData" Display="Dynamic" ValidationExpression='<%# Eval("RegEx") %>'> </asp:RegularExpressionValidator>
</td>
</tr>
</ItemTemplate>
</asp:Repeater>
리피터는 "명명 컨테이너"를 생성하여 FieldData 컨트롤 ID가 컨테이너 내에서 고유한지 확인합니다.
예는 다음과 같습니다.
ID = "패널 홀더"(또는 동적으로 추가 할 수 있음)를 사용하여 설계 시간에 페이지에 패널 컨트롤을 추가하십시오.
그런 다음 컨트롤을 동적으로 만들고 다음과 같은 패널에 추가하십시오.
var myTextbox = new TextBox() {ID="myTextBox"};
PanelHolder.Controls.Add(myTextBox);
var validator = new RequiredFieldValidator() {ControlToValidate="myTextBox",Display=ValidatorDisplay.Dynamic,ErrorMessage="Required field"}
PanelHolder.Controls.Add(validator);
몇 가지 질문 만하면됩니다.
페이지 뒤로 게시하는 컨트롤이 유효성을 유효하게합니까? (그렇다면 별도의 검증 그룹에 있지 않은지 확인하십시오)
검증이 발생하지 않습니까? 유효성 검사기의 errormessage 속성을 설정하지 않으면 아무것도하지 않는다고 생각하기가 쉽습니다. (그리고 나는 당신이 당신의 목록에 그것을 설정하는 것을 볼 수 없습니다)
편집하다:
이렇게하고 있다면 :
Panel pTest = new Panel();
TextBox tb = new TextBox();
for (int i = 0; i < 2; i++)
{
tb.ID = "tbDynamicTextBox" + i;
pTest.Controls.Add(tb );
RequiredFieldValidator rfv = new RequiredFieldValidator();
rfv.ControlToValidate = tb.ID;
rfv.ErrorMessage = "Empty textbox";
pTest.Controls.Add(rfv);
}
cell.Controls.Add(pTest);
그런 다음 텍스트 상자의 하나의 인스턴스 만 Controls Collection에 추가되므로 오류가 발생합니다. 'textbox tb = new TextBox ()를 이동하면; '루프 내부의 일부는 괜찮을 것입니다.
이것이 당신의 문제인지 확실하지 않지만 시도해 볼 가치가 있습니다.
그리드 내부의 Texbox에 대한 Texbox 및 필요한 필드 유효성 검사기를 생성합니다.
TextBox의 ClientID를 필요한 필드 유효성 검사기의 ControlTovalIdate 속성으로 사용하려고 시도했습니다.이 gived는 텍사스 박스의 ID를 필수 필드 유효성 검사기의 컨트롤 테이블 디테이트 속성으로 찾을 수 없었으며 아래 코드 아래 코드를 반환합니다. 방법에 대한 첫 번째 인수.
private RegularExpressionValidator GetRegValidator(string itemId, string regExp)
{
RegularExpressionValidator _regVal = new RegularExpressionValidator();
_regVal.ControlToValidate = itemId;
_regVal.ValidationExpression = regExp;
_regVal.ErrorMessage ="PropertyRegexDoesNotMatches";
_regVal.Text = "*";
_regVal.SetFocusOnError = true;
_regVal.EnableClientScript = true;
_regVal.ID = string.Format("{0}Validator", itemId);
return _regVal;
}