I have a client-side Javascript I use in an ASP.NET page to set the visibility of a couple of items in a datalist. Basically, when item 1 is visible, item 2 should be hidden and vice-versa. This code also enables/disables some ASP.NET required field validators depending on the visibility of the fields around them on the client side.
The code works fine unless I have an ASP.NET validation error. When the validation fails, the fields reset to their default visibility (hidden).
I've ruled out this being a postback since my server-side breakpoints don't get hit when the problem occurs. This seems to be something with the client-side script.
Server-side fixes are out since the page never posts back. I'm wondering how I can do this from a Javascript perspective? Is there a way to fire custom code when the validation scripts fire?
I thought about using a cookie, but I don't think that will help me unless I can hook into the validation event.
Code follows...
function handleDropDown(e, a, b, c, v1, v2, h1, h2) {
var i = parseInt(c) + 2;
var x = parseInt(c) + 3;
if (e.value == "Yes") {
document.getElementById(i).style.display = "inline";
document.getElementById(i).style.visibility = "visible";
document.getElementById(x).style.display = "none";
document.getElementById(x).style.visibility = "hidden";
document.getElementById(a).focus();
//Enable validator if needed
var oVal1 = document.getElementById(v1);
var oVal2 = document.getElementById(v2);
var oVis1 = document.getElementById(h1);
var oVis2 = document.getElementById(h2);
ValidatorEnable(oVal1, true);
if (oVis1 != null) {
oVis1.value = "true";
}
ValidatorEnable(oVal2, false);
if (oVis2 != null) {
oVis2.value = "false";
}
}
else if (e.value == "No") {
document.getElementById(x).style.display = "inline";
document.getElementById(x).style.visibility = "visible";
document.getElementById(i).style.display = "none";
document.getElementById(i).style.visibility = "hidden";
document.getElementById(b).focus();
//Enable validator if needed
var oVal1 = document.getElementById(v1);
var oVal2 = document.getElementById(v2);
var oVis1 = document.getElementById(h1);
var oVis2 = document.getElementById(h2);
ValidatorEnable(oVal1, false);
if (oVis1 != null) {
oVis1.value = "false";
}
ValidatorEnable(oVal2, true);
if (oVis2 != null) {
oVis2.value = "true";
}
}
}
ASPX Markup snippet: **
<span id="spTxtAnswer" class="required" visible="false" runat="server">*</span>
<asp:TextBox ID="txtAnswer" Text='<%# Bind("Answer") %>' runat="server"
TextMode="MultiLine" Height="76px" MaxLength="2000" Width="370px" Visible="false" >
</asp:TextBox>
<asp:RequiredFieldValidator ID="valTextBox" ErrorMessage="This question is required." Enabled="false"
Display="Static" ControlToValidate="txtAnswer" runat="server" ValidationGroup="Request" />
<asp:RequiredFieldValidator ID="valAnswer" ControlToValidate="txtAnswer" ErrorMessage="<br />Other description is required."
Display="Static" enabled="false" runat="server" ValidationGroup="Request" />
<span id="spDdlAnswer" class="required" visible="false" runat="server">*</span>
<asp:DropDownList ID="ddlAnswer" Visible="false" runat="server" />
<asp:RequiredFieldValidator ID="valDropDown" ControlToValidate="ddlAnswer" Enabled="false"
ErrorMessage="This field is required." Display="Static" runat="server"
InitialValue="(Select)" ValidationGroup="Request" />
<asp:HiddenField ID="hfQuestionID" Value='<%# Bind("QuestionID") %>' runat="server" />
<asp:HiddenField ID="hfAnswer" Value='<%# Bind("Answer") %>' runat="server" />
<asp:HiddenField ID="hfRequired" Value='<%# Bind("Required") %>' runat="server" />
<asp:HiddenField ID="hfVisible" Value="false" runat="server" />
CodeBehind snippet:
TextBox tb1 = (TextBox)gridUserSupplierTypeQuestionsAndAnswers.Rows[rowIndex + 1].FindControl("txtAnswer");
TextBox tb2 = (TextBox)gridUserSupplierTypeQuestionsAndAnswers.Rows[rowIndex + 2].FindControl("txtAnswer");
RequiredFieldValidator rfv1 = (RequiredFieldValidator)gridUserSupplierTypeQuestionsAndAnswers.Rows[rowIndex + 1].FindControl("valTextBox");
RequiredFieldValidator rfv2 = (RequiredFieldValidator)gridUserSupplierTypeQuestionsAndAnswers.Rows[rowIndex + 2].FindControl("valTextBox");
HiddenField hf1 = (HiddenField)gridUserSupplierTypeQuestionsAndAnswers.Rows[rowIndex + 1].FindControl("hfVisible");
HiddenField hf2 = (HiddenField)gridUserSupplierTypeQuestionsAndAnswers.Rows[rowIndex + 2].FindControl("hfVisible");
ddl.Attributes.Add("onchange", "handleDropDown(this,'" + tb1.ClientID + "','" + tb2.ClientID + "','" + questionID + "','" + rfv1.ClientID + "','" + rfv2.ClientID + "'," +
"'" + hf1.ClientID + "','" + hf2.ClientID + "');");
//When selected and viewing in edit mode, set the visibility during page load
string script = "<script language='javascript'>";
script += System.Environment.NewLine + "var el = document.getElementById('" + ddl.ClientID + "');";
script += System.Environment.NewLine + "handleDropDown(el,'" + tb1.ClientID + "','" + tb2.ClientID + "','" + questionID + "','" + rfv1.ClientID + "','" + rfv2.ClientID + "');</script>";
ClientScript.RegisterStartupScript(Page.GetType(),"startScript", script);
**