Conditional required field validation in an ASP.net ListView
I'm having a heck of a time trying to figure out how to implement validation in a ListView. The goal is to require the user to enter text in the comments TextBox, but only if the CheckBox is checked. Downside is that these controls are in the EditTemplate of a ListView. Below is a snippet of the relevant code portion of the EditTemplate:
<tr style="background-color: #00CCCC; color: #000000">
<td>
Assume Risk?
<asp:CheckBox ID="chkWaive" runat="server"
Checked='<%# Bind("Waive") %>' />
</td>
<td colspan="5">
<asp:RequiredFieldValidator ID="RequiredFieldValidator1"
runat="server" ErrorMessage="Comments required"
ControlToValidate="txtComments" />
<asp:TextBox Width="95%" ID="txtComments" runat="server"
Text='<%# Eval("Comment") %>'></asp:TextBox>
</td&开发者_JAVA百科gt;
<td>
<asp:Button ID="btnSave" runat="server"
Text="Save" CommandName="Update" Width="100px" />
</td>
</tr>
Is there a way to do conditional validation using this method? If not, is there a way I could validate manually in the ItemUpdating event of the Listview, or somewhere else, and on a failure, alert the user of the error via a label or popup alert?
You can use a CustomValidator
.
ASPX
<asp:CustomValidator runat="server" id="custPrimeCheck"
ControlToValidate="txtPrimeNumber"
OnServerValidate="PrimeNumberCheck"
ClientValidationFunction="CheckPrime"
ErrorMessage="Invalid Prime Number" />
Server Side Validation
Sub PrimeNumberCheck(sender as Object, args as ServerValidateEventArgs)
Dim iPrime as Integer = Cint(args.Value), iLoop as Integer, _
iSqrt as Integer = CInt(Math.Sqrt(iPrime))
For iLoop = 2 to iSqrt
If iPrime mod iLoop = 0 then
args.IsValid = False
Exit Sub
End If
Next
args.IsValid = True
End Sub
Clientside Validation
<script language="JavaScript">
<!--
function CheckPrime(sender, args)
{
var iPrime = parseInt(args.Value);
var iSqrt = parseInt(Math.sqrt(iPrime));
for (var iLoop=2; iLoop<=iSqrt; iLoop++)
if (iPrime % iLoop == 0)
{
args.IsValid = false;
return;
}
args.IsValid = true;
}
// -->
</script>
Sample taken from https://web.archive.org/web/20211020145934/https://www.4guysfromrolla.com/articles/073102-1.aspx
In a catastrophic display of ineptitude, I managed to miss that the ListView exposes the property EditItem. Which means I can get away with
CType(ListView1.EditItem.FindControl("chkWaive"),CheckBox).Checked
I can query the state of that and the text box using a CustomValidator, per Mr. Grassman's response.
精彩评论