You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在前序问题回答为Yes时要求用户填写textbox?

解决方案:前置问题选Yes时才要求填写文本框

针对你遇到的需求,这里提供两种可行的ASP.NET解决方案,兼顾客户端和服务器端验证(避免客户端脚本被绕过):

方案1:扩展CustomValidator实现条件必填

你已经在使用CustomValidator,直接扩展它的逻辑最方便:

客户端验证脚本

写一个自定义JS函数,根据前置问题的选中状态判断是否需要检查文本框:

function ValidateConditionalTextBox(sender, args) {
    // 获取前置单选控件(假设ID为rblPreQuestion)
    var rbl = document.getElementById('<%= rblPreQuestion.ClientID %>');
    var isYesSelected = false;
    // 遍历单选按钮确定选中值
    const radioInputs = rbl.getElementsByTagName('input');
    for (let i = 0; i < radioInputs.length; i++) {
        if (radioInputs[i].checked && radioInputs[i].value === "Yes") {
            isYesSelected = true;
            break;
        }
    }
    // 选Yes则检查文本框是否为空,选No直接通过验证
    if (isYesSelected) {
        args.IsValid = (document.getElementById('<%= txtRequiredWhenYes.ClientID %>').value.trim() !== "");
    } else {
        args.IsValid = true;
    }
}

ASPX控件配置

将CustomValidator的客户端验证函数指向上述方法,并开启空文本验证:

<asp:RadioButtonList ID="rblPreQuestion" runat="server">
    <asp:ListItem Text="Yes" Value="Yes"></asp:ListItem>
    <asp:ListItem Text="No" Value="No"></asp:ListItem>
</asp:RadioButtonList>

<asp:TextBox ID="txtRequiredWhenYes" runat="server"></asp:TextBox>

<asp:CustomValidator ID="cvConditional" runat="server" 
    ControlToValidate="txtRequiredWhenYes"
    ClientValidationFunction="ValidateConditionalTextBox"
    ValidateEmptyText="true"
    ErrorMessage="当前置问题选Yes时,此文本框为必填项"
    OnServerValidate="cvConditional_ServerValidate">
</asp:CustomValidator>

服务器端验证(关键)

后台实现ServerValidate事件,逻辑与客户端保持一致,防止客户端脚本被绕过:

protected void cvConditional_ServerValidate(object source, ServerValidateEventArgs args)
{
    if (rblPreQuestion.SelectedValue == "Yes")
    {
        args.IsValid = !string.IsNullOrWhiteSpace(txtRequiredWhenYes.Text);
    }
    else
    {
        args.IsValid = true;
    }
}

方案2:动态控制RequiredFieldValidator的启用状态

如果你更倾向用RequiredFieldValidator,可以通过脚本和后台代码动态开关验证:

客户端切换脚本

单选按钮切换时触发,启用/禁用必填验证:

function ToggleRequiredValidator() {
    var rbl = document.getElementById('<%= rblPreQuestion.ClientID %>');
    var isYesSelected = false;
    const radioInputs = rbl.getElementsByTagName('input');
    for (let i = 0; i < radioInputs.length; i++) {
        if (radioInputs[i].checked && radioInputs[i].value === "Yes") {
            isYesSelected = true;
            break;
        }
    }
    // 获取并更新验证器状态
    const validator = document.getElementById('<%= rfRequired.ClientID %>');
    validator.enabled = isYesSelected;
    ValidatorEnable(validator, isYesSelected);
}

ASPX控件配置

给单选列表绑定切换事件,默认禁用必填验证:

<asp:RadioButtonList ID="rblPreQuestion" runat="server" onchange="ToggleRequiredValidator()">
    <asp:ListItem Text="Yes" Value="Yes"></asp:ListItem>
    <asp:ListItem Text="No" Value="No"></asp:ListItem>
</asp:RadioButtonList>

<asp:TextBox ID="txtRequiredWhenYes" runat="server"></asp:TextBox>

<asp:RequiredFieldValidator ID="rfRequired" runat="server"
    ControlToValidate="txtRequiredWhenYes"
    ErrorMessage="此文本框为必填项"
    Enabled="false">
</asp:RequiredFieldValidator>

服务器端同步状态

页面提交时同步验证器状态,避免客户端状态失效:

protected void Page_Load(object sender, EventArgs e)
{
    if (IsPostBack)
    {
        rfRequired.Enabled = (rblPreQuestion.SelectedValue == "Yes");
    }
    else
    {
        rfRequired.Enabled = false;
    }
}

内容的提问来源于stack exchange,提问作者Ann

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 12:55:22