如何控制ASP.NET验证控件的客户端验证

3
以下是运行以下代码后我的页面输出:
我在我的情况下使用了客户端验证ValidatorEnable(如果您知道更好的方法,请告诉我)。
我的问题是:
我有一个带有复选框和相邻下拉列表的网格视图,如屏幕截图所示。
因此,如果用户选中复选框,则启用下拉列表以进行选择。如果用户单击提交按钮,则验证并要求用户从下拉列表中选择任何选项。
问题:
但问题是:它对我点击的所有行进行验证,而不是特定的一行。
如何强制验证用户选中复选框的特定行?
    <asp:GridView ID="gv" runat="server" AutoGenerateColumns="False" DataKeyNames="Id" OnRowDataBound="gv_RowDataBound"
            EnableModelValidation="True">
            <Columns>
                <asp:BoundField DataField="ID" ControlStyle-Width="250px" HeaderText="ID" SortExpression="ID" />
                <asp:BoundField DataField="FirstName" ControlStyle-Width="250px" HeaderText="FirstName"
                    SortExpression="FirstName" />
                <asp:BoundField DataField="LastName" ControlStyle-Width="250px" HeaderText="LastName"
                    SortExpression="LastName" />
                <asp:TemplateField>
                    <ItemTemplate>
                        <asp:CheckBox ID="checkbox1" runat="server" />
                        <asp:DropDownList ID="ddl_PaymentMethod" runat="server">
                                    <asp:ListItem Value="-1">----</asp:ListItem>
                                    <asp:ListItem Value="0">Month</asp:ListItem>
                                    <asp:ListItem Value="1">At End</asp:ListItem>
                                    <asp:ListItem Value="2">At Travel</asp:ListItem>
                                </asp:DropDownList>
                        <asp:RequiredFieldValidator ID="requiredDDL" runat="server" ControlToValidate="ddl_PaymentMethod"
                            ErrorMessage="Please select" InitialValue="-1" Display="Dynamic"></asp:RequiredFieldValidator>
                    </ItemTemplate>
                </asp:TemplateField>
                <asp:TemplateField HeaderText="Value">
                    <ItemTemplate>
                        <asp:TextBox ID="txt_Value" runat="server" Width="58px" Text="0"></asp:TextBox>
                    </ItemTemplate>
                </asp:TemplateField>
            </Columns>
        </asp:GridView>


protected void gv_RowDataBound(object sender, GridViewRowEventArgs e)
{
 if (e.Row.RowType == DataControlRowType.DataRow)
 {
    CheckBox checkbox1 = (CheckBox)e.Row.FindControl("checkbox1");
    DropDownList ddl_PaymentMethod = (DropDownList)e.Row.FindControl("ddl_PaymentMethod");
    ddl_PaymentMethod.Attributes.Add("disabled", "disabled");

   checkbox1.Attributes.Add("onclick", "javascript:EnableCheckBox('" + ddl_PaymentMethod.ClientID + "','" + checkbox1.ClientID + "')"); 
 }
}

function EnableCheckBox(ddl, chk) {

  var ddl_PaymentMethod = document.getElementById(ddl);
  var _chkbox = document.getElementById(chk);
  if (_chkbox.checked) {
      ddl_PaymentMethod.disabled = false;
      validateCheckBox(ddl_PaymentMethod, true);
   }
   else { 
      ddl_PaymentMethod.disabled = true;
      validateCheckBox(ddl_PaymentMethod, false);
   }
}

function validateCheckBox(ddl, state) {
    ValidatorEnable(document.getElementById(ddl.id, state));             
}

请查看此帖子,它与您的问题非常相似,希望能对您有所帮助。 http://stackoverflow.com/questions/10432090/conditional-requiredfieldvalidator-inside-of-a-repeater/10432932#10432932 - ahaliav fox
请查看此帖子,它与您的问题非常相似,希望能对您有所帮助。http://stackoverflow.com/questions/10432090/conditional-requiredfieldvalidator-inside-of-a-repeater/10432932#10432932 - ahaliav fox
谢谢提供链接,但代码不完整,还是无法解决。 - Nick Kahn
那段代码缺少什么? - ahaliav fox
1个回答

3

我帮你解决了问题... GridView:

<asp:GridView ID="gv" runat="server" AutoGenerateColumns="False" DataKeyNames="Id"  OnRowDataBound="gv_RowDataBound">
        <Columns>
            <asp:BoundField DataField="ID" ControlStyle-Width="250px" HeaderText="ID" SortExpression="ID" />
            <asp:BoundField DataField="FirstName" ControlStyle-Width="250px" HeaderText="FirstName"
                SortExpression="FirstName" />
            <asp:BoundField DataField="LastName" ControlStyle-Width="250px" HeaderText="LastName"
                SortExpression="LastName" />
            <asp:TemplateField>
                <ItemTemplate>
                    <asp:CheckBox ID="checkbox1" runat="server" />
                    <asp:DropDownList ID="drpPaymentMethod" runat="server">
                                <asp:ListItem Value="-1">----</asp:ListItem>
                                <asp:ListItem Value="0">Month</asp:ListItem>
                                <asp:ListItem Value="1">At End</asp:ListItem>
                                <asp:ListItem Value="2">At Travel</asp:ListItem>
                            </asp:DropDownList>
                    <asp:RequiredFieldValidator ID="rfv" InitialValue="-1" ControlToValidate="drpPaymentMethod" Enabled="false" Display="Static" runat="server" ErrorMessage="RequiredFieldValidator"></asp:RequiredFieldValidator>

                </ItemTemplate>
            </asp:TemplateField>
            <asp:TemplateField HeaderText="Value">
                <ItemTemplate>
                    <asp:TextBox ID="txt_Value" runat="server" Width="58px" Text="0"></asp:TextBox>
                </ItemTemplate>
            </asp:TemplateField>
        </Columns>
    </asp:GridView>

CS:

protected void gv_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        if (e.Row.RowType == DataControlRowType.DataRow)
        {
            CheckBox checkbox1 = e.Row.FindControl("checkbox1") as CheckBox;
            RequiredFieldValidator rfv = e.Row.FindControl("rfv") as RequiredFieldValidator;
            DropDownList drpPaymentMethod = (DropDownList)e.Row.FindControl("drpPaymentMethod");
            // you can just pass "this" instead of "myDiv.ClientID" and get the ID from the DOM element
            checkbox1.Attributes.Add("onclick", "UpdateValidator('" + checkbox1.ClientID + "','" + drpPaymentMethod.ClientID + "','" + rfv.ClientID + "');");
            if (!checkbox1.Checked)
                drpPaymentMethod.Attributes.Add("disabled", "disabled");
        }
    }

JavaScript:

function UpdateValidator(chkID, drpID, validatorid) {
        //enabling the validator only if the checkbox is checked
        var enableValidator = $("#" + chkID).is(":checked");

        if (enableValidator)
            $('#' + drpID).removeAttr('disabled');
        else
            $('#' + drpID).attr('disabled', 'disabled');

        var vv = $('#' + validatorid).val();

        ValidatorEnable(document.getElementById(validatorid), enableValidator);
    }

我有类似的问题,并在这里发布了,请看一下:http://stackoverflow.com/questions/10662245/checkbox-in-headertemplate-validates-itemtemplate-checkbox - Nick Kahn
1
我发布了一个答案,祝一切顺利! - ahaliav fox

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接