gpt4 book ai didi

c# - 列表的 ViewModel 验证

转载 作者:IT王子 更新时间:2023-10-29 03:41:29 26 4
gpt4 key购买 nike

我有以下 View 模型定义

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

因此在我的应用程序中必须至少有 1 个人进行访问请求。您可以使用什么方法来验证?我不希望这种验证发生在我的 Controller 中,这很容易做到。唯一的选择是自定义验证属性吗?

编辑:目前正在使用 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");

关于c# - 列表的 ViewModel 验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5146732/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com