web-dev-qa-db-ja.com

FluentValidation:2つのフィールドのいずれかが空かどうかを確認します

私はこれを持っていますmodel

_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
    }
}
_

1つのフィールドのみをチェックするには、RuleFor(person => person.FirstName).NotNull();

しかし、それらの1つがnullかどうかを確認するにはどうすればよいですか。

また、fluentValidationを介して検証が作成されたら、クライアント側でそれを使用してエラーを表示できますか?

Edit1

_    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>
}
_
37
Cybercop

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));

2番目の質問に関しては、FluentValidationはクライアント側の検証で機能しますが、すべてのルールがサポートされているわけではありません。 ここ クライアント側でサポートされているバリデーターを見つけることができます:

  1. NotNull/NotEmpty
  2. 一致(正規表現)
  3. InclusiveBetween(範囲)
  4. クレジットカード
  5. Eメール
  6. EqualTo(プロパティ間の等価比較)
  7. 長さ

リストにないルールの場合、独自のFluentValidationPropertyValidatorを記述し、GetClientValidationRulesを実装する必要があります。 StackOverflow で簡単な検索を行うことで、このサンプルをいくつか見つけることができます。

64
Zabavsky

これを試して

RuleFor(person => person).Must(person => !string.IsNullOrEmpty(person.FirstName) || !string.IsNullOrEmpty(person.LastName))
11
Fat Shogun

入力した料金が前の料金と同じかどうかを確認するためにこれを行いました。前の料金と同じ場合、エラーが発生します。これは私のために働いた。

public class CasualMealChargeValidator : AbstractValidator<CasualMealCharge>
{
    public CasualMealChargeValidator(CasualMealCharge CMC)
    {
        //RuleFor(x => x.BankName).NotEmpty().When(pm => pm.PaymentMode == "Cheque").WithMessage("Enter Bank.");
        RuleFor(x => x).Must(x => x.DN != CMC.DN || x.BF != CMC.BF || x.LN != CMC.LN).WithMessage("Not Saved - Meal charges are same as current charges.").WithName("CMFor");
    }
}
5
RAVI VAGHELA

このライブラリはわかりませんが、これらの2つのプロパティのnullを確認するだけの場合は、これを使用できます。

RuleFor(person => person.FirstName ?? person.LastName).NotNull();

[〜#〜] edit [〜#〜]これは、InvalidOperationExceptionをスローするため機能しません。代わりにZabavskyのソリューションを使用してください。

3
Carsten Heine

2つのフィールドのうちの1つが空であるかどうかをチェックし、意味のあるエラーコードを見つけるための素敵なルールセットは次のとおりです。

public CustomerSourceValidator()
    {
        CascadeMode = CascadeMode.StopOnFirstFailure;

        RuleFor(x => x)
            .NotNull().WithErrorCode("source_id_or_email_required")
            .When(source => source.Email == null && source.Id == null);

        RuleFor(x => x.Id)
            .NotNull().WithErrorCode("source_id_required")
            .Matches(CommonValidationRegex.CustomerIdRegexString).WithErrorCode("source_id_invalid")
            .When(source => source.Id != null);

        RuleFor(x => x.Email)
            .NotNull().WithErrorCode("source_email_required")
            .Matches(CommonValidationRegex.EmailRegexString).WithErrorCode("source_email_invalid")
            .When(source => source.Email != null);
    }
1
dummyDev

最後に、これは私のために働いた。少なくとも1つが必要な3つのプロパティを検証したかった。エラーメッセージは1回だけ返されます。

RuleFor(p => p).Cascade(CascadeMode.StopOnFirstFailure)
            .Must(p => !string.IsNullOrWhiteSpace(p.FirstName))
            .When(p => p.Id == 0 && string.IsNullOrWhiteSpace(p.LastName)).WithMessage("At least one is required (Id, FirstName, LastName).")
            .Must(p => !string.IsNullOrWhiteSpace(p.LastName))
            .When(p => p.Id == 0 && string.IsNullOrWhiteSpace(p.FirstName)).WithMessage("At least one is required (Id, FirstName, LastName).")
            .Must(p => p.Id != 0)
            .When(p => string.IsNullOrWhiteSpace(p.FirstName) && string.IsNullOrWhiteSpace(p.LastName)).WithMessage("At least one is required (Id, FirstName, LastName).");
0
Nishith Shah