c# - FluentValidation:检查两个字段之一是否为空

标签 c# .net asp.net-mvc validation fluentvalidation

我有这个模型

public class Person
{
    public int Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }  
}

我想创建一个验证,其中 FirstName 或 LastName 必须由用户填写。 我安装了 FluentValidation 并创建了一个customvalidator 类

public class PersonValidator:AbstractValidator<Person>
{
    public PersonValidator()
    {
        RuleFor((person=>person.FirstName)//don't know how to check if one is empty
    }
}

要只检查一个字段,我可以执行 RuleFor(person => person.FirstName).NotNull();

但是我如何检查其中一个是否为空。

此外,是否可以在通过 fluentValidation 创建验证后,在客户端使用它来显示错误?

编辑1

    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();

        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        BundleConfig.RegisterBundles(BundleTable.Bundles);
        FluentValidationModelValidatorProvider.Configure();
    }
//creating validation
namespace WebApplication1.Models.CustomValidator
{
    public class PersonValidator:AbstractValidator<Person>
    {
        public PersonValidator()
        {
            RuleFor(m => m.FirstName).NotEmpty().When(m => string.IsNullOrEmpty(m.LastName)).WithMessage("*Either First Name or Last Name is required");
            RuleFor(m => m.LastName).NotEmpty().When(m => string.IsNullOrEmpty(m.FirstName)).WithMessage("*Either First Name or Last Name is required");
        }
    }

}
//model class
[Validator(typeof(PersonValidator))]
public class Person
{
    public Person()
    {
        InterestList = new List<string>();
    }
    public int Id { get; set; }
    public int ContactId { get; set; }
    [RequiredIfEmpty("LastName")]
    public string FirstName { get; set; }
    [RequiredIfEmpty("FirstName")]
    public string LastName { get; set; }
    public string EmailAddress { get; set; }
    public string Phone { get; set; }
    public string Country { get; set; }
    public List<string> InterestList { get; set; } 
}
//view
@model WebApplication1.Models.Person

<script src="@Url.Content("~/Scripts/jquery-1.8.2.min.js")"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.min.js")"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")"></script>
<script src="@Url.Content("~/Scripts/jquery.unobtrusive-ajax.min.js")" type="text/javascript"></script>

@Html.ValidationSummary(true)
@using(Html.BeginForm("AddPerson","Person",FormMethod.Post))
{
    <div class="label">First Name</div>
    <div class="input-block-level">@Html.TextBoxFor(m=>m.FirstName)@Html.ValidationMessageFor(m=>m.FirstName)</div>
    <br/>
    <div class="label">Last Name</div>
    <div class="input-block-level">@Html.TextBoxFor(m=>m.LastName)@Html.ValidationMessageFor(m=>m.LastName)</div>
    <button type="submit" class="btn-primary">Submit</button>
}

最佳答案

您可以使用 When/Unless条件:

RuleFor(m => m.FirstName).NotEmpty().When(m => string.IsNullOrEmpty(m.LastName));
RuleFor(m => m.LastName).NotEmpty().When(m => string.IsNullOrEmpty(m.FirstName));

RuleFor(m => m.FirstName).NotEmpty().Unless(m => !string.IsNullOrEmpty(m.LastName));
RuleFor(m => m.LastName).NotEmpty().Unless(m => !string.IsNullOrEmpty(m.FirstName));

关于您的第二个问题,FluentValidation 适用于客户端验证,但并非所有规则都受支持。 Here您可以找到客户端支持的验证器:

  1. NotNull/NotEmpty
  2. 匹配(正则表达式)
  3. InclusiveBetween(范围)
  4. 信用卡
  5. 电子邮件
  6. EqualTo(跨属性相等比较)
  7. 长度

对于不在列表中的规则,您必须编写自己的 FluentValidationPropertyValidator 并实现 GetClientValidationRules。您可以在 StackOverflow 上找到一些示例通过简单的搜索。

关于c# - FluentValidation:检查两个字段之一是否为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21115179/

相关文章:

c# - PowerPoint 插件中的文本颜色

c# - 拼接器,音频被切断。时间轴中的单个图像和音频 :(

c# - C#中 bool 值到字符串值的转换

c# - WebAPI,将一个或集合对象发布到同一操作而不更改消息正文

asp.net - IIS7 MVC 路由不工作

c# - 如何仅在第一次填充 SQL 表列

c# - 此 linq 代码中的多个 orderby

.net - 如何在登台服务器中调试 .net dll 程序集

c# - 在单个方法调用中改变对犀牛模拟的期望

c# - ASP.NET MVC 5 开发速度太慢