문제

나는 내가하려고했던 것이 다소 사소하다고 생각했지만, 그것은 나를 크게 곤경에 빠뜨리는 것으로 밝혀졌다. 상황이 여기 있습니다.

두 개의 라디오 버튼 (Radbutton을 사용하여 구현)과 RadtextBox가 있습니다. 두 개의 라디오 버튼 중 하나를 선택할 때 radtextbox가 비어 있지 않다는 양식을 제출하기 전에 클라이언트를 확인하고 싶습니다 (첫 번째 라디오 버튼을 가정 해 봅시다). CustomValidator를 사용했으며 ValidateEmptyText = "True"를 운이 없습니다. 코드의 추출은 다음과 같습니다.

<asp:Panel runat="server" ID="Panel1">
<table>
    <tr>
        <td class="auto-style5">
            <telerik:RadButton ID="rdBtnIndividual" runat="server" AutoPostBack="False" GroupName="rdEmplrType" 
                Text="Individual" ToggleType="Radio" OnClientCheckedChanged="rdBtnPhysical_CheckedChanged" 
                UseSubmitBehavior="False">
                <ToggleStates>
                    <telerik:RadButtonToggleState PrimaryIconCssClass="rbToggleRadioChecked" />
                    <telerik:RadButtonToggleState PrimaryIconCssClass="rbToggleRadio" />
                </ToggleStates>
            </telerik:RadButton>
        </td>
        <td>
            <telerik:RadButton ID="rdBtnLegal" runat="server" AutoPostBack="False" GroupName="rdEmplrType" Text="Legal Entity" 
                ToggleType="Radio" OnClientCheckedChanged="rdBtnLegal_CheckedChanged" UseSubmitBehavior="False">
                <ToggleStates>
                    <telerik:RadButtonToggleState PrimaryIconCssClass="rbToggleRadioChecked" />
                    <telerik:RadButtonToggleState PrimaryIconCssClass="rbToggleRadio" />
                </ToggleStates>
            </telerik:RadButton>
        </td>
    </tr>
    <tr>
        <td class="auto-style5">
            <label>Name:</label>
        </td>
        <td>
            <telerik:RadTextBox ID="txtName" Runat="server" EmptyMessage="Name" LabelWidth="64px" Resize="None" Width="160px" DisabledStyle-BackColor="Silver">
            </telerik:RadTextBox>
        </td>
        <td><asp:RequiredFieldValidator ID="THIS_IS_WORKING" ControlToValidate="txtName"
                runat="server" ErrorMessage="<img src='images/Exclamation.png' Title='Required Field'/>" >
            </asp:RequiredFieldValidator>
        </td>
    </tr>
    <tr>
        <td class="auto-style5">
            <label>Father's Name</label>
        </td>
        <td style="width:100px">
            <telerik:RadTextBox ID="txtFathersName" Runat="server" EmptyMessage="Father's Name" LabelWidth="64px" Resize="None" Width="160px" DisabledStyle-BackColor="Silver">
            </telerik:RadTextBox>
        </td>
        <td>
            <asp:CustomValidator runat="server" ID="NOT_WORKING_VALIDATOR" ControlToValidate="txtFathersName" ValidateEmptyText="True"
                ClientValidationFunction="RequiredIfIndividual"
                ErrorMessage="<img src='images/Exclamation.png' Title='Required Field'/>" EnableClientScript="True">
            </asp:CustomValidator>

        </td>
    </tr>
</table>
</asp:Panel>

JavaScript는 다음과 같습니다.

<script type="text/javascript">
    function RequiredIfIndividual(sender, args) {
        var chkBoxIndividual = $find("<%=rdBtnIndividual.ClientID%>");
        chkBoxIndividual = $telerik.toButton(chkBoxIndividual);
        if (chkBoxIndividual.get_checked()) {
            if (args.Value == "") {
                args.IsValid = false;
            }
            else {
                args.IsValid = true;
            }
        } else {
            args.IsValid = true;
        }
    }

</script>
도움이 되었습니까?

해결책

이 문제를 해결하기 위해 시간을 보낸 후 문제의 근본 원인을 찾았습니다.

이 문제는 .NET 4.5의 새로운 눈에 거슬리지 않는 유효성 검사 모드와 관련이 있습니다. 이것이 제대로 작동하려면 jQuery 2.0이 필요합니다. 이것은 .NET 4.5의 표준입니다. 그러나 RadControls (최소한 2013 년 3 분기)의 임베디드 jQuery 버전은 v1.9.1입니다 ( 여기). 결과적으로 CustomValidator 더 이상 제대로 작동하지 않습니다.

이것에 대한 두 가지 대안이 있습니다 - 나는 첫 번째를 성공적으로 시도했습니다.

  1. 눈에 띄지 않는 유효성 검사 모드를 비활성화하십시오. 이렇게하려면 다음 줄을 포함시켜야합니다. <appSettings> 섹션의 섹션 web.config 파일:

    <add key="ValidationSettings:UnobtrusiveValidationMode" value="None" />

    단점 : 눈에 잘 띄지 않는 유효성 검사 모드는 유효성 검사를 수행하기 위해 생성 된 JavaScript 코드를 제거하기 위해 새로운 HTML5 기능의 SE를 만들도록 설계되어 페이지가 더 가벼워집니다 (참조). 여기). 비활성화하면이 기능을 사용하지 않습니다.

  2. Radcontrols 용 jQuery 버전을 사용하지 않도록 선택하고 .NET 4.5 (예 : v2.0)에서 제공하는 것을 사용하십시오.

    단점 : 여기서 문제는 Radcontrols가 jQuery의 임베디드 버전을 사용하여 테스트되었으며 문제가 발생할 수 있다는 것입니다. jQuery의 임베디드 버전을 비활성화하려면 참조하십시오. 이 링크

이것이 같은 문제를 우연히 발견 할 다음 사람이 도움이되기를 바랍니다.

다른 팁

ValidatorValidate 함수를 수동으로 호출하고 rdbtnphysical_checkedchanged 및 rdbtnlegal_checkedchanged 핸들러 내에서 사용자 정의 Validator 인스턴스를 전달해야합니다. 아래에서 당신을 위해 짧은 예를 준비했습니다.

  <script type="text/javascript">
            function RequiredIfIndividual(sender, args) {
                var chkBoxIndividual = $find("<%=rdBtnIndividual.ClientID%>");
                chkBoxIndividual = $telerik.toButton(chkBoxIndividual);
                if (chkBoxIndividual.get_checked()) {
                    if (args.Value == "") {
                        args.IsValid = false;
                    }
                    else {
                        args.IsValid = true;
                    }
                } else {
                    args.IsValid = true;
                }
            }

            function rdBtnPhysical_CheckedChanged(sender, args) {
                ValidatorValidate($get("NOT_WORKING_VALIDATOR"));
            }

            function rdBtnLegal_CheckedChanged(sender, args) {
                ValidatorValidate($get("NOT_WORKING_VALIDATOR"));
            }

        </script>

방금 코드를 테스트했는데 잘 작동하는 것 같습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top