2012-03-14 53 views
12

私はユーザがサインアップできるウィザードを使って作業しています。 2つのオプションを持つasp:RadioButtonListがあり、ラジオボタンが変更されると、ウィザードの入力フィールドの一部が変更されます。各フィールドにはいくつかのasp:Validator(asp:RequiredFieldValidatorなど)があります。問題は、ユーザーがページを送信すると、隠しテキストボックスのバリデータがまだポップアップしていることです。aspを有効/無効にする:jqueryを使用するバリデータ

まず、ここで私はトリックを行う必要があります読んだことが、次の、のようなjQueryのを使用してそれを解決しようとしてい

<div id="divTxt1"> 
    <asp:TextBox runat="server" CssClass="text" ID="txtNumber" 
     type="number"/> 
    <asp:RequiredFieldValidator ID="RequiredFieldValidator1" 
     runat="server" ControlToValidate="txtNumber" EnableClientScript="true" ErrorMessage="Error" ToolTip="Error">* 
    </asp:RequiredFieldValidator> 
</div> 
<div id="divTxt2"> 
    <asp:TextBox runat="server" CssClass="text" ID="txtNumber2" 
     type="number"/> 
    <asp:RequiredFieldValidator ID="RequiredFieldValidator2" 
     runat="server" ControlToValidate="txtNumber2" EnableClientScript="true" ErrorMessage="Error2" ToolTip="Error2">* 
    </asp:RequiredFieldValidator> 
</div> 
<div id="radio"> 
<asp:RadioButtonList ID="RadioButtonList1" runat="server" RepeatDirection="Horizontal"> 
    <asp:ListItem Value="1" Selected="True">Privat</asp:ListItem> 
    <asp:ListItem Value="2">Offentlig</asp:ListItem> 
    </asp:RadioButtonList> 
</div> 

示すテキストボックスとRadioButtonListのを変更するdivタグであるが、残念ながらそれをそうではありません:

$(document).ready(function() { 

    $('#<%= WizardStep1.ContentTemplateContainer.FindControl("RadioButtonList1").ClientID %> input').change(function() { 
     if ($(this).val() == "1") { 
      $('#txtNumber').toggle('fast'); 
      $('#txtNumber2').toggle('fast');  
      ValidatorEnable($('#<%=WizardStep1.ContentTemplateContainer.FindControl("RequiredFieldValidator1").ClientID %>')[0], false); 
      ValidatorEnable($('#<%=WizardStep1.ContentTemplateContainer.FindControl("RequiredFieldValidator2").ClientID %>')[0], true); 
     } 

     if ($(this).val() == "2") { 
      $('#txtNumber').toggle('fast'); 
      $('#txtNumber2').toggle('fast'); 
      ValidatorEnable($('#<%=WizardStep1.ContentTemplateContainer.FindControl("RequiredFieldValidator2").ClientID %>')[0], false); 
      ValidatorEnable($('#<%=WizardStep1.ContentTemplateContainer.FindControl("RequiredFieldValidator1").ClientID %>')[0], true); 
     } 
    }); 
}); 

何か問題がありますか?これらの記事で説明したように

+0

は本当ですか?あなたはコントロールを見つけることができますか? NULLをチェック? –

+0

私はIEでデバッグするときにエラーなく通過しますが、無効にはしません。 – Thomas

+0

JavaScriptのエラーはありません 'それは動作していない場合はcoz、1つでなければならない、あなたはそう思いますか???火かき棒で調べてみてください。それはあなたにヒントを与えるはずです。 – MrClan

答えて

10

バリデータのためのクライアント側のAPIがhereです。あなたのニーズに適応することができるかもしれ

何か(これは、クライアントスクリプトを経由してすべてのバリデータが無効になります):

if (Page_Validators) { 
    PageValidators.forEach(function(pageValidator) { 
     if (pageValidator == null) {return;} 
     vldGrp = pageValidator.validationGroup; 
     ValidatorEnable(pageValidator, false); 
    }); 
}; 

だから、バリデータ名を確認するためにifブロックを追加し、以上のようでした

if (Page_Validators) { 
    PageValidators.forEach(function(pageValidator) { 
     if (pageValidator == null) {return;} 
     if (pageValidator.controltovaliddate != "<%= txtNumber2.ClientID %>") { 
      return; 
     } 
     ValidatorEnable(pageValidator, false); 
    }); 
}; 

を、それはRIの場合にも、おそらくループでブレークを追加する必要がありますし、それを無効にする - バリのターゲットIDを返します.controlToValidateあなたがそれ以上のバリデーターをチェックする必要がない場合は、1つです。あなたは早く破るために.some instead of .forEachを使用することができます。

if (Page_Validators) { 
    PageValidators.some(function(pageValidator) { 
     if (pageValidator == null) {return false;} 
     if (pageValidator.controltovaliddate != "<%= txtNumber2.ClientID %>") { 
      return false; 
     } 
     ValidatorEnable(pageValidator, false); 
     return true; 
    }); 
}; 

あなたが関数にこれをカプセル化することができます:

var validatorState = function(element, isEnabled) { 
    if (Page_Validators) { 
     PageValidators.some(function(pageValidator) { 
      if (pageValidator == null) {return false;} 
      if (pageValidator.controltovaliddate != "<%= txtNumber2.ClientID %>") { 
       return false; 
      } 
      ValidatorEnable(pageValidator, false); 
      return true; 
     }); 
    }; 
}; 

と使用:

validatorState('txtCancellationReson', true); 

または

validatorState($('#txtCancellationReson').attr('id'), true); 
0
+0

なぜdownvote? 2番目のリンクは問題を解決します。 – Oybek

+0

それはまさに私の質問でしたが、私は応答しないことにしました。 –

+2

http://stackoverflow.com/help/how-to-answerより「良い答えを書くにはどうすればいいですか?」 リンクのコンテキストを指定してください 「リンクは外部リソースへのリンクですが、リンクの前後にコンテキストを追加してくださいなぜなら、ターゲットサイトに到達できない場合や、永久にオフラインになる場合など、常に重要なリンクの最も関連性の高い部分を引用するからです。 –

2

"RadioButtonList1"のCustomValidatorコントロールを使用して、別のjavascript関数への可視性ロジックを分離します。私はより良いオプションは、単に使用することがわかった

<div id="divTxt1"> 
    <asp:TextBox runat="server" CssClass="text" ID="txtNumber" type="number"/> 
</div> 
<div id="divTxt2"> 
<asp:TextBox runat="server" CssClass="text" ID="txtNumber2" 
type="number"/> 
</div> 
<div id="radio"> 
    <asp:RadioButtonList ID="RadioButtonList1" runat="server"  RepeatDirection="Horizontal"  onchange:"javascript:toogleTexxBoxesVisibility(this);"> 
    <asp:ListItem Value="1" Selected="True">Privat</asp:ListItem> 
    <asp:ListItem Value="2">Offentlig</asp:ListItem> 
    </asp:RadioButtonList> 
<asp:CustomValidator ID="CustomValidator1" runat="server"  ClientValidationFunction="clientSideValidationFunction" ControlToValidate="RadioButtonList1" OnServerValidate="CustomValidator1_ServerValidate" Text="Validation Error Message">asp:CustomValidator> 

<script type="text/javascript"> 
function clientSideValidationFunction(source,arguments) 
    var inputvalue = arguments.Value; //RadioButtonList1's value 

    if (inputvalue == "1" && $('#txtNumber').val() == '') { 
     arguments.IsValid = false; 
    } 
    else if (inputvalue == "2" && $('#txtNumber2').val() == '') { 
     arguments.IsValid = false; 
    } 
    else { 
     arguments.IsValid = true; 
    } 
}; 

function toogleTexxBoxesVisibility(radiobutton) 
{ 
    if(radiobutton.val =='1') 
    { 
     $('#txtNumber').show('fast'); 
     $('#txtNumber2').hide('fast'); 
    } 
    else if(radiobutton.val =='2') 
    { 
     $('#txtNumber').hide('fast'); 
     $('#txtNumber2').show('fast'); 
    } 
} 
</script> 
</div> 
12

document.getElementById("<%=myValidator.ClientID %>").enabled = true; 

ValidatorEnabledオプションリンク制御の検証を呼び出し、私の場合には、自動的に上記の提案としては、エラーメッセージを表示「を入力してください

「.enabled = true」オプションを使用すると、「売り手名の値」が使用されません。

関連する問題