asp:RequiredFieldValidator不验证隐藏字段

mem*_*eme 22 c# asp.net validation controls webforms

ASP.NET验证器似乎不验证隐藏字段.我得到这样的消息:

无法验证由"hiddenFieldValidator"的ControlToValidate属性引用的控件"hiddenField".

我的<asp:HiddenField>页面中有一个填充客户端的值.我需要在服务器上出现一次,所以我添加了一个RequiredFieldValidator.

它不起作用!

在我看来,作为一种解决方法,我可以:

1.使用自定义验证器而不是将其绑定到隐藏字段,只需调用方法OnServerValidate;

2.使用<asp:TextBox>CSS样式display:none,它应该工作.

但我想确保我在这里没有遗漏一些东西.是否可以以与其他文本字段相同的方式验证隐藏字段?哦,也许是第三个更优雅的选择?

TIA!

Sco*_*NET 36

@Peter的回答让我思考,究竟ControlPropertiesValid检查了什么?

查看MSDN主题,除了其他内容之外,它ValidationPropertyAttribute还会查找.. Hhmm,所以如果我们只是派生HiddenFieldValidationPropertyAttribute设置为新类Value(为了我的目的),那么"一切正常".确实如此.

using System.Web.UI;
using System.Web.UI.WebControls;

namespace Partner.UserControls {
    [ValidationProperty("Value")]
    public class HiddenField2 : HiddenField {
    } // nothing else required other than ValidationProperty
}
Run Code Online (Sandbox Code Playgroud)

用法 - 确保注册包含控件的程序集:

<%@ Register Assembly="MyApp" Namespace="MyApp.Controls" TagPrefix="sw" %>
Run Code Online (Sandbox Code Playgroud)

在您的Page/UserControl内容中:

<sw:HiddenField2 ID="hidSomeImportantID" runat="server" />
Run Code Online (Sandbox Code Playgroud)

所有验证器都可以使用它.额外的好处是,如果您(像我一样)使用自定义验证功能,您可以轻松评估HiddenField2.Value它,因为它包含在args.Value字段中(在服务器端这是ServerValidateEventArgs).


And*_*tad 5

正如您所说的异常消息所示,似乎HiddenField控件无法直接通过标准验证控件进行定位.我会选择CustomValidator解决方法.


Pet*_*ter 5

这是我提出的解决方法,因为遗憾的是我找不到任何可靠的方法来使用RequiredFieldValidator或开箱即用的CustomValidator进行验证.如果将ControlToValidate属性保留为空,则会对您大喊大叫.您所要做的就是创建一个自定义控件,如下所示:

public class HiddenFieldValidator : RequiredFieldValidator
{
    protected override bool ControlPropertiesValid()
    {
        return true;
    }
}
Run Code Online (Sandbox Code Playgroud)

通过覆盖属性有效检查以使其始终返回true,它不再关心您正在使用HiddenField,它将从中提取值并验证没有问题.