0

ラジオボタンを使用した簡単なフォームを作成しようとしています。ラジオ ボタンを AutoPostBack = True に設定します。このように、ラジオ ボタンが true/false の場合、サブパネルは表示または非表示になります。ラジオ ボタンは必須フィールドです。選択したラジオ ボタンの値が挿入される非表示のテキスト ボックスもあり、このテキスト ボックスは (空かどうか) に対して検証されます。

問題 1:

これは、送信して検証が失敗するまで機能します。検証メッセージが表示され、AutoPostBack = True のラジオ ボタンの 1 つをクリックすると、すべての検証が消えます。これは、ラジオ ボタンがクリックされたときに実行されるメソッドに Page.Validate() を追加することで解決できます。ただし、ページに既に検証エラーが表示されていない限り、Page.Validate() を実行したくありません (したがって、フォームが既に送信されて検証に失敗しない限り、再検証は行われません)。

現状では、フォームが送信されて検証に失敗する前に、ラジオボタンの質問をクリックすると、検証が必要な他のすべての質問で検証エラーが表示されます。送信をクリックしたときに表示されるすべての検証メッセージをクリアする AutoPostBack を克服することだけを考えています。

問題 2:

検証に合格しなかった場合、質問の色を変更できるようにしたいと思います。デフォルトの .net 設定を上書きするために JavaScript を追加しました。私はこれを機能させましたが、RadioButton AutoPostBack の後ではなく、送信ボタンをクリックしたときのみです。

現在、[送信] をクリックすると、必要なすべての質問が赤くなり、必要な検証メッセージも表示されます。しかし、ラジオ ボタンをクリックして検証エラーの修正を開始すると、AutoPostBack で、赤だったすべての質問が元の黒に戻り、必要な検証メッセージが引き続き表示されます。コード ビハインド メソッドで Page.Validation() と一緒に Javascript を呼び出して再度実行するにはどうすればよいですか?

どんな助けでも大いに役に立ちます!ありがとう

以下は、これまでのコードの例です。

ASPX コード:

    <asp:Table ID="Table1" runat="server" CellSpacing="0" CellPadding="0">
<asp:TableRow>
<asp:TableCell CssClass="question">
<label>4. Have you had an abnormal result from a prenatal test (e.g. amniocentesis, blood test, ultrasound)?</label>

</asp:TableCell>
<asp:TableCell CssClass="answer">
<ul class="selectGroup">
<li>
<asp:RadioButton ID="Q4_true" runat="server" Checked='<%# Bind("Q4_yes") %>' Text="Yes"
GroupName="4" OnCheckedChanged='RB_QuestionSubPane_YN' AutoPostBack="true" /></li>
<li>
<asp:RadioButton ID="Q4_false" runat="server" Checked='<%# Bind("Q4_no") %>' Text="No"
GroupName="4" OnCheckedChanged='RB_QuestionSubPane_YN' AutoPostBack="true" />
</li>
<asp:TextBox ID="Q4_validationBox" runat="server" CssClass="hiddenField" Enabled="false"
Text=''></asp:TextBox>
<asp:RequiredFieldValidator ID="RequiredFieldValidator1" EnableViewState="true" ControlToValidate="Q4_validationBox"
Display="Dynamic" runat="server" ErrorMessage="RequiredFieldValidator"></asp:RequiredFieldValidator>
</ul>
</asp:TableCell>
</asp:TableRow>
</asp:Table>

コードビハインド

    protected void RB_QuestionSubPane_YN(object sender, EventArgs e)
{

RadioButton radio_Selected = (RadioButton)sender;
string radio_QuestionID = Convert.ToString(radio_Selected.ID);

(((TextBox)FormView1.FindControl(strQuestionID + "_validationBox")).Text) = radio_Selected.ID.ToString();

Page.Validate();

}

JavaScript

    ValidatorUpdateDisplay = function (val) {
var ctl = $('#' + val.controltovalidate);
var eCount = 0;
for (var i = 0; i < Page_Validators.length; i++) {
var v = Page_Validators[i];
if (v.controltovalidate == val.controltovalidate) {

if (!v.isvalid) {
eCount++;
ctl.addClass('validationError');
$('td.question:eq(' + i + ')').addClass('red');
}

};
}
if (eCount > 0) {
ctl.addClass('validationError');

} else {
ctl.removeClass('validationError');
$('td.question:eq(' + i + ')').removeClass('red');
}
if (typeof (val.display) == "string") {
if (val.display == "None") {
return;
}
if (val.display == "Dynamic") {
val.style.display = val.isvalid ? "none" : "inline";
return;
}
}
if ((navigator.userAgent.indexOf("Mac") > -1) &&
(navigator.userAgent.indexOf("MSIE") > -1)) {
val.style.display = "inline";
}
val.style.visibility = val.isvalid ? "hidden" : "visible";
}
4

1 に答える 1

1

本当に必要なのはカスタム検証のようです。そうすれば、ニーズに合わせて検証を完全にカスタマイズできます。

簡単な例を次に示します。

<script language="javascript" type="text/javascript" >
function CustomValidator1_ClientValidate(source,args)
{   
    //put your javascript logic here
}
//-->
</script>
<body>
    <form id="form1" runat="server">
    <div>   
    <asp:RadioButton ID="RadioButton1" runat="server" GroupName="direction" Text="left" />
    <asp:RadioButton ID="RadioButton2" runat="server" GroupName="direction" Text="right" />
    <asp:Button ID="Button1" runat="server" Text="Button" onclick="Button1_Click" />
    <asp:CustomValidator id="CustomValidator1" runat="server" Display="Dynamic" ErrorMessage="please choose" ClientValidationFunction="CustomValidator1_ClientValidate" OnServerValidate="CustomValidator1_ServerValidate"></asp:CustomValidator>
    </div>
    </form>
</body>

サーバ側

    protected void CustomValidator1_ServerValidate(object source, ServerValidateEventArgs args)
    {
        args.IsValid = RadioButton1.Checked || RadioButton2.Checked;
    }
    protected void Button1_Click(object sender, EventArgs e)
    {
        if (Page.IsValid)
        {
            //validate is successful.
        }
    }
于 2012-09-09T15:55:32.813 に答える