我有以下视图模型定义

public class AccessRequestViewModel
{
    public Request Request { get; private set; }
    public SelectList Buildings { get; private set; }
    public List<Person> Persons { get; private set; }
}

因此,在我的应用程序中,必须至少有一个人请求访问权限.您可以使用什么方法来验证?我不希望这种验证发生在我的控制器上,这很简单.唯一的 Select 是自定义验证属性吗?

Edit:当前正在使用FluentValidation(尼斯库!)执行此验证

RuleFor(vm => vm.Persons)
                .Must((vm, person) => person.Count > 0)
                .WithMessage("At least one person is required");

推荐答案

如果使用数据批注执行验证,则可能需要自定义属性:

public class EnsureOneElementAttribute : ValidationAttribute
{
    public override bool IsValid(object value)
    {
        var list = value as IList;
        if (list != null)
        {
            return list.Count > 0;
        }
        return false;
    }
}

然后:

[EnsureOneElement(ErrorMessage = "At least a person is required")]
public List<Person> Persons { get; private set; }

或者让它更通用:

public class EnsureMinimumElementsAttribute : ValidationAttribute
{
    private readonly int _minElements;
    public EnsureMinimumElementsAttribute(int minElements)
    {
        _minElements = minElements;
    }

    public override bool IsValid(object value)
    {
        var list = value as IList;
        if (list != null)
        {
            return list.Count >= _minElements;
        }
        return false;
    }
}

然后:

[EnsureMinimumElements(1, ErrorMessage = "At least a person is required")]
public List<Person> Persons { get; private set; }

就我个人而言,我使用FluentValidation.NET而不是数据批注来执行验证,因为我更喜欢命令式验证逻辑而不是声明性验证逻辑.我觉得它的威力更大.因此,我的验证规则将简单地如下所示:

RuleFor(x => x.Persons)
    .Must(x => x.Count > 0)
    .WithMessage("At least a person is required");

Asp.net相关问答推荐

Visual Studio发布的网站得到错误类型JObject is not defined when page is load on server"''"

检测 ASP.NET 中的内存泄漏

asp.net、url 重写模块和 web.config

在 appSettings 中存储字符串数组?

说服遗留应用程序 VB6 开发人员切换到 C#

ASP.NET 平台是否有与 Heroku 等价的工具?

在 Asp.net 中通过 Button 的 CommandArgument 传递多个参数

如何在页面的基类中执行 Page_Load()?

防止 asp.net Web 表单中的跨站点请求伪造 (csrf) 攻击

我应该使用用户名还是用户 ID 来引用 ASP.NET 中经过身份验证的用户

从 ASP.NET 中的 POST 方法中检索数据

如何在 ASP.Net 网络表单中使用标签?

如何使div按钮提交其所在的表单?

如何从 ASP.NET 中的数据表/数据视图中 Select 前 n 行

如何在 ASP.Net Gridview 中添加确认删除选项?

ASP.NET 身份,需要强密码

Azure 网站 301 重定向 - 我应该把它放在哪里?

ModalPopupExtender OK 按钮单击事件未触发?

try 为 Medium Trust 开发是否会失败?

Appdomain 回收究竟是什么