2012-07-10 25 views
0

在我的网页我有一个使用自定义验证文本框:自定义验证的JavaScript函数总是返回下拉列表中的选择的值作为0

<asp:CustomValidator ID="cv_Question" ControlToValidate="tb_Question" runat="server" ErrorMessage="*" OnServerValidate="ValidateQuestion" ClientValidationFunction="CheckQuestion" ForeColor="#FF0000" ValidationGroup="CreateUser"></asp:CustomValidator> 

,我想在客户端验证脚本总是使用即使下拉列表索引已更改,下拉列表中的SelectedValue也会返回0。

我下拉列表默认索引设置为0与Page.IsPostBack

这里的下拉列表:

<asp:DropDownList ID="ddl_Question" runat="server" EnableViewState="true" AutoPostBack="true" onselectedindexchanged="ddl_Question_SelectedIndexChanged"> 
     <asp:ListItem Selected="False" Text="Select a question" Value="0"></asp:ListItem> 
     <asp:ListItem Selected="False" Text="What was the first movie I ever saw?" Value="1"></asp:ListItem>   
     <asp:ListItem Selected="False" Text="What is the middle name of my oldest child?" Value="2"></asp:ListItem> 
     <asp:ListItem Selected="False" Text="In what city was my father born?" Value="3"></asp:ListItem> 
     <asp:ListItem Selected="False" Text="Who was my favourite cartoon character as a child?" Value="4"></asp:ListItem> 
     <asp:ListItem Selected="False" Text="What is my mother's middle name?" Value="5"></asp:ListItem> 
     <asp:ListItem Selected="False" Text="In what year did I meet my significant other?" Value="6"></asp:ListItem> 
     <asp:ListItem Selected="False" Text="What was my first pet's name?" Value="7"></asp:ListItem> 
     <asp:ListItem Selected="False" Text="First name of the maid of honour at my wedding?" Value="8"></asp:ListItem> 
     <asp:ListItem Selected="False" Text="First name of my best friend in elementary school?" Value="9"></asp:ListItem> 
     <asp:ListItem Selected="False" Text="Name of my all-time favourite movie character?" Value="10"></asp:ListItem> 
     <asp:ListItem Selected="False" Text="Create a question" Value="11"></asp:ListItem> 
    </asp:DropDownList> 

这里是客户端验证:

<script type="text/javascript" language="javascript"> 
     function CheckQuestion(sender, args) 
     {   
      var Question = args.Value.toString(); 

      <% if(Convert.ToInt32(ddl_Question.SelectedValue) == 11) 
      { %> 
       if (Question != "" && Question != null) 
       { 
        args.IsValid = true; 
        return; 
       } 
       else 
       { 
        args.IsValid = false; 
        return; 
       } 
      <% } 
      else 
      { %> 
       alert(<%= Convert.ToInt32(ddl_Question.SelectedValue)%>); 
       args.IsValid = true; 
       return; 
      <% } %> 
     } 
    </script> 

我只想验证tb_Question,如果用户从ddl_Question中选择了“创建问题”。

编辑:

这是我的SelectedIndexChanged方法。当用户选择“创建问题”时,tb_Question变得可见。这发生在任何验证发生之前。

protected void ddl_Question_SelectedIndexChanged(object sender, EventArgs e) 
    { 
     if (Convert.ToInt32(ddl_Question.SelectedValue) == 11) 
     { 
      Question.Visible = true; 
     } 
     else 
     { 
      Question.Visible = false; 
     } 
    } 

回答

1

那么我的建议是使用简单的JavaScript

所以不是这样做的,使用JavaScript和可能的jQuery这样

的jQuery的NuGet:https://nuget.org/packages/jQuery

<script type="text/javascript" src="Scripts/jquery-1.7.2.min.js"></script> 
<script type="text/javascript" language="javascript"> 
    function CheckQuestion(sender, args) 
    {   
     var Question = args.Value.toString(); 
     var questionID = '<%= this.ddl_Question.ClientID %>'; 
     var currentQuestion = $("#" + questionID).val(); 

     if (currentQuestion == '11') 
     { 
      if (Question != "" && Question != null) 
      { 
       args.IsValid = true; 
       return; 
      } 
      else 
      { 
       args.IsValid = false; 
       return; 
      } 
     } 
     else 
     { 
      alert(currentQuestion); 
      args.IsValid = true; 
      return; 
     } 
    } 
</script> 
+0

我的ddl_Question_SelectedIndexChanged事件是否不回发给服务器?用户必须先选择“创建问题”才能看到tb_Question。在客户端验证功能发生之前,SelectedIndexChanged已经被触发了。 – Mausimo 2012-07-10 16:52:47

+0

正如你所说的,使用JavaScript的问题是args对应于tb_Question而不是ddl_Question。 – Mausimo 2012-07-10 16:54:30

+0

哦好吧lemme更新答案,它真的很容易 – Jupaol 2012-07-10 16:54:40

0

问题更可能在Convert.ToInt32调用,因为这个工具方法返回零时传递给它的值为null(你可以查看MSDN来验证这一点。http://msdn.microsoft.com/en-us/library/sf1aw27b.aspx)SelectedValue属性很可能无效此时即使所选索引为零。尝试以编程方式设置SelectedValue,然后看看我有什么不同。

+0

我不知道为什么它会为空。在tb_Question变得可见之前,用户必须选择“创建问题”。这是通过ddl_Question_SelectedIndexChanged事件完成的。此事件正常运行。一旦tb_Question变得可见,我修改它并且自定义验证器触发调用无法正常工作的客户端验证。 – Mausimo 2012-07-10 16:46:30