views:

141

answers:

2

I have an ASP.NET form for currency exchange requests. There are two text fields there: amount-source and amount-target.

One of them must be filled and only one.

How to implement this using Validators, if applicable?

+1  A: 

I would implement a custom Validator and decorate both TextBoxes with it. If both are filled, then both are in a error state.

Arthur
+4  A: 

You can use Custom Validators for this:

<asp:Textbox id="textbox1" runat="server" />
<asp:CustomValidator id="valCustom" runat="server"
    ControlToValidate="textbox1"
    ClientValidationFunction="ClientValidate"
    OnServerValidate="ServerValidate"
    ErrorMessage="*You can only enter 1" dispaly="dynamic">*
</asp:CustomValidator>

<asp:Textbox id="textbox2" runat="server" />
<asp:CustomValidator id="valCustom2" runat="server"
    ControlToValidate="textbox2"
    ClientValidationFunction="ClientValidate"
    OnServerValidate="ServerValidate"
    ErrorMessage="*You can only enter 1" dispaly="dynamic">*
</asp:CustomValidator>

<script language="Javascript">
  function ClientValidate(source, arguments)
  {
    var tb1 = document.getElementById("<%=textbox1.ClientID %>").value;
    var tb2 = document.getElementById("<%=textbox2.ClientID %>").value;
    if (tb1 && tb2 || (!tb1 && !tb2)){
        arguments.IsValid = false;
    } else {
        arguments.IsValid = true;
    }
  }
</script>

Server-side:

protected void ServerValidate(object sender, ServerValidateEventArgs args)
{
  if(string.isNullOrEmpty(textbox1.Text) && string.isNullOrEmpty(textbox2.Text))
    args.IsValid = false;
  else if(!string.isNullOrEmpty(textbox1.Text) && !string.isNullOrEmpty(textbox2.Text))
    args.IsValid = false;
  else
    args.IsValid = true;
}

If you're using jQuery please comment...this can all be much cleaner.

Nick Craver