如果我有一个带有字段列表的搜索对象,是否可以使用System.ComponentModel.DataAnnotation命名空间将其设置为验证搜索中至少有一个字段不为Null或空?也就是说,所有字段都是可选的,但至少应该始终输入一个字段.

推荐答案

我会为此创建一个自定义验证器——它不会提供客户端验证,只提供服务器端验证.

请注意,要使其工作,您需要使用nullable种类型,因为值类型默认为0false:

首先创建一个新的验证器:

using System.ComponentModel.DataAnnotations;
using System.Reflection;

// This is a class-level attribute, doesn't make sense at the property level
[AttributeUsage(AttributeTargets.Class)]
public class AtLeastOnePropertyAttribute : ValidationAttribute
{
  // Have to override IsValid
  public override bool IsValid(object value)
  {
    //  Need to use reflection to get properties of "value"...
    var typeInfo = value.GetType();

    var propertyInfo = typeInfo.GetProperties();

    foreach (var property in propertyInfo)
    {
      if (null != property.GetValue(value, null))
      {
        // We've found a property with a value
        return true;
      }
    }

    // All properties were null.
    return false;
  }
}

然后,您可以使用以下内容来装饰您的模型:

[AtLeastOneProperty(ErrorMessage="You must supply at least one value")]
public class SimpleTest
{
    public string StringProp { get; set; }
    public int? Id { get; set; }
    public bool? BoolProp { get; set; }
}

然后,当您调用ModelState.IsValid时,您的验证程序将被调用,您的消息将被添加到视图上的ValidationSummary中.

请注意,您可以扩展它来判断返回的属性的类型,或者如果愿意,可以查找它们上的属性以包括/排除验证——这是假设一个通用验证器不知道它正在验证的类型.

Asp.net相关问答推荐

DataTables-如何修改来自JSON响应或其他DataTables参数的无结果(ZeroRecords)消息

此版本的 SQL Server 不支持用户实例登录标志.连接将关闭

我可以在一个 Web 项目中有多个 web.config 文件吗?

威胁已经被清除了

如何使用 SmtpClient.SendAsync 发送带有附件的邮箱?

ASP.net 页面在导入语句上出现错误,但我确实有参考?

在 Asp.net mvc5 中使用用户名而不是邮箱作为身份

Asp.net Identity 密码哈希

使用 LINQ 进行递归控制搜索

使用 ASP.NET Web API 对 PUT 和 DELETE 的 CORS 支持

带有 ASP.NET WebMethod 的 Jquery AJAX 返回整个页面

Web.Config 中的 Assemblies node 的用途是什么?

通过 ASP.NET/C# 使用 Plupload

System.Reflection.Assembly.LoadFile 锁定文件

删除 HTML 或 ASPX 扩展

覆盖静态方法

为在 ASP.NET Web API 中使用 User.Identity.Name 的方法编写单元测试

如何使用 jquery 设置单选按钮 Select 的值

使用 ConfigurationManager.RefreshSection 重新加载配置而不重新启动应用程序

如何在 ASP.NET 响应中传递大文件?