2012-09-09 48 views
0

我想創建一個使用單選按鈕的簡單窗體。我將單選按鈕設置爲AutoPostBack = True,這樣,如果單選按鈕爲真/假,子面板顯示或隱藏。單選按鈕是必填字段。我也有一個隱藏的文本框,所選單選按鈕的值被插入,並且這個文本框是我驗證的對象(空或不)。asp.net c#驗證

問題1:

這工作,直到你去提交和驗證失敗。驗證消息顯示,然後當您使用AutoPostBack = True單擊其中一個單選按鈕時,所有驗證消失。我可以通過將Page.Validate()添加到單擊單選按鈕時運行的方法來解決此問題。但是,我不想讓Page.Validate()運行,除非頁面已經顯示驗證錯誤(所以它不會重新驗證,除非表單已經提交併且驗證失敗)。

就目前而言,在表單提交之前,驗證失敗:當您單擊任何單選按鈕問題時,所有其他需要驗證的問題都會顯示驗證錯誤。我只是想克服AutoPostBack,它將清除您點擊提交時顯示的所有驗證消息。

問題2:

我希望能夠改變這個問題的顏色,如果它沒有通過驗證。我添加了JavaScript來覆蓋默認的.net設置。我得到這個工作,但只有當你點擊提交按鈕,而不是一個RadioButton AutoPostBack後。

當前,當您單擊提交時,所有必填問題都會變成紅色,並且還會顯示所需的驗證消息。但是,如果您單擊單選按鈕開始修復驗證錯誤,則在AutoPostBack上,所有現在變爲紅色的問題都會變回原始黑色,並且仍會顯示所需的驗證消息。我怎樣才能調用JavaScript來再次與代碼後面的方法中的Page.Validation()一起運行?

任何幫助將大大appricated!謝謝

下面是目前爲止的代碼示例。

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"; 
} 

回答

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. 
     } 
    } 
+0

感謝您的輸入。我有一個有700多個問題的表單,我正在嘗試創建一個解決方案,因此我不必爲每個問題寫出每個radiobutton1.checked。 有沒有一種方法來計算無效驗證的數量或檢查驗證是否在代碼後面運行?這樣,如果計數大於0或驗證已經運行,我可以運行Page.Validate()命令。 – user891073