C# 仅当在下拉列表中选择了值时,才进行代码隐藏字段验证

C# 仅当在下拉列表中选择了值时,才进行代码隐藏字段验证,c#,asp.net,code-behind,validation,C#,Asp.net,Code Behind,Validation,我不是asp.net大师,所以我正面临着这件愚蠢的事情带来的不幸。 我有一份登记表,其中只有在从下拉列表中选择了值“IT”时,才必须验证字段(增值税编号称为“piva”) 这是前端代码: <asp:TextBox ID="pivaTextBox" runat="server" Text='<%# Bind("piva") %>' MaxLength="50" Width="400px" /> <asp:RequiredFieldValidator ID="Req

我不是asp.net大师,所以我正面临着这件愚蠢的事情带来的不幸。 我有一份登记表,其中只有在从下拉列表中选择了值“IT”时,才必须验证字段(增值税编号称为“piva”)

这是前端代码:

<asp:TextBox ID="pivaTextBox" runat="server" Text='<%# Bind("piva") %>' 
MaxLength="50" Width="400px" />

<asp:RequiredFieldValidator ID="RequiredPiva" runat="server" 
ControlToValidate="pivaTextBox" 
ErrorMessage="<%$ Resources:Resource, CampoObbligatorio %>" Display="Dynamic" 
CssClass="little_text" />

<asp:CustomValidator ID="PivaEsistente" runat="server" 
ErrorMessage="Partita IVA esistente nel database" meta:resourcekey="PivaEsistente" 
ControlToValidate="pivaTextBox" CssClass="little_text" Display="Dynamic" 
onservervalidate="PIVAEsistente_ServerValidate"></asp:CustomValidator>

<asp:RegularExpressionValidator ID="PivaSize" runat="server" ControlToValidate="pivaTextBox" CssClass="little_text" Display="Dynamic" ErrorMessage="Check the VAT Number length. 11 characters and only numbers."  ValidationExpression="[0-9]{11}"  ValidationGroup="pivaItalia">
</asp:RegularExpressionValidator>

在后面的代码中,我写道:

protected void PIVAEsistente_ServerValidate(object source, ServerValidateEventArgs args)
{
    string piva = args.Value;
    using (CMALinqModelDataContext ent = new CMALinqModelDataContext())
    {
        var n = (from u in ent.VUser
                 where u.piva == piva
                 select u).Count<VUser>();
        args.IsValid = n.ToString().Equals("0");
    }
}

protected void nazioneDropDownList_SelectedIndexChanged(object sender, EventArgs e)
{
    DropDownList ddl = (DropDownList)sender;
    DropDownList ddlProv = (DropDownList)FormUser.FindControl("provinciaDropDownList");


    if ("it".Equals(ddl.SelectedValue))
    {
        ddlProv.Enabled = true;
        Page.Validate("pivaItalia");

    }
    else
    {
        ddlProv.SelectedIndex = 0;
        ddlProv.Enabled = false;
    }

}
受保护的void PIVAEsistente\u ServerValidate(对象源,ServerValidateEventArgs args)
{
字符串piva=args.Value;
使用(CMALinqModelDataContext ent=new CMALinqModelDataContext())
{
var n=(从ent.VUser中的u开始)
其中u.piva==piva
选择u.Count();
args.IsValid=n.ToString().Equals(“0”);
}
}
受保护的无效nazioneDropDownList\u SelectedIndexChanged(对象发送方,事件参数e)
{
DropDownList ddl=(DropDownList)发送方;
DropDownList ddlProv=(DropDownList)FormUser.FindControl(“provinciaDropDownList”);
如果(“it.”等于(ddl.SelectedValue))
{
ddlProv.Enabled=true;
第页验证(“pivaItalia”);
}
其他的
{
ddlProv.SelectedIndex=0;
ddlProv.Enabled=false;
}
}
第一种方法检查增值税编号是否已经存在并且有效。 第二个检查是否已从国家下拉列表中选择“it”,并解锁省下拉列表,并应根据上述RegularExpressionValidator验证增值税编号

事实上,它总是验证,但最糟糕的是,即使我收到错误消息,表单也可以提交。 那不好


有人能提出解决方案吗?我遗漏了什么?

看起来你的问题是套管

在您的问题中,您声明“我有一个注册表,其中只有在从下拉列表中选择了值“IT”时,才必须验证字段(VAT编号称为“piva”)。然而,在您的代码中,您正在将小写值与此代码中的所选值进行比较:

if ("it".Equals(ddl.SelectedValue))
{
    ddlProv.Enabled = true;
    Page.Validate("pivaItalia");

}
else
{
    ddlProv.SelectedIndex = 0;
    ddlProv.Enabled = false;
}
相反,强制将值与相同的情况进行比较(或
.ToLower()
.ToUpper()
),如下所示:

if ("it".Equals(ddl.SelectedValue.ToLower()))
{
    ddlProv.Enabled = true;
    Page.Validate("pivaItalia");

}
else
{
    ddlProv.SelectedIndex = 0;
    ddlProv.Enabled = false;
}


除了必须排序的大写字母外,如果是这种情况,问题是“SelectedValue”,您应该使用“SelectedItem”

if (ddl.SelectedItem.Equals("it"))
{
    ddlProv.Enabled = true;
    Page.Validate("pivaItalia");

}
else
{
    ddlProv.SelectedIndex = 0;
    ddlProv.Enabled = false;
}
我在一个组合框(ddl)上测试了它,我有:it、pippo、papa等等,它可以工作:

private void button1_Click(object sender, EventArgs e)
    {
        if (ddl.SelectedItem.Equals("it"))
        {
            label1.Text = "ok";
        }

        else 
        {
            label1.Text = "no";
        }

    }

因此,如果您仍然有问题,请更好地解释发生了什么,可能是问题现在在其他地方。

我已经编辑了您的标题。请看“”,其中的共识是“不,他们不应该”。我已经编辑了我的答案。Ciaokall他需要的是SelectedItem而不是SelectedValue抱歉Karl。正如我几秒钟前写给费利西姆的,大写字母是一个打字错误。我无法控制验证停止,除非选择“it”。有什么建议吗?Thanks@FeliceM-FeliceM,我的选择框是这样形成的:意大利。实际上我需要这个值。同样,我通过从国家中选择“it”打开省下拉列表的部分工作正常。不起作用的是验证。它必须仅在选择“It”时执行,但始终执行。我很生气:(@Aptivus,这很奇怪。让我做一个测试,我会更新我回答中的代码。我已经回滚了我的答案,那么问题是什么,它一定是在检查小写字母“it”?嗨,thaks FeliceM。事实上,在stackoverflow上,大写字母输入错误。值总是“it”(小写)。问题是验证不会仅在所选项目等于“it”时启动,但它始终处于活动状态。除非已选择“it”,否则我如何“冻结”验证?抱歉打扰您,菲利斯,您能指导我这件事吗?除非选择“it”,否则我如何“冻结”验证是否已被选中?是否有任何技巧仅在您编写的if的真实情况下进行验证?我非常困惑。非常感谢社区的帮助。更多信息:您是意大利人吗?我am@Aptivus,我不知道为什么您的验证不起作用。一定是其他地方有干扰。但是,我的联系人是但我不知道我还能为你做些什么。是的,我是意大利人。
private void button1_Click(object sender, EventArgs e)
    {
        if (ddl.SelectedItem.Equals("it"))
        {
            label1.Text = "ok";
        }

        else 
        {
            label1.Text = "no";
        }

    }