2014-01-14 33 views
23

我有這個模式FluentValidation:檢查兩個領域之一是空

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

我想創造一個無論是名字或姓氏必須由用戶填寫驗證。 我安裝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創建驗證,在客戶端使用它來顯示錯誤?

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> 
} 
+0

什麼是'RequiredIfEmpty'屬性? – Zabavsky

回答

3

我不知道該庫,但如果你只是想檢查空這兩個屬性,那麼你可以使用這個:

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

編輯這不起作用,因爲它會拋出一個InvalidOperationException。改用Zabavsky的解決方案。

+2

在這裏OP真的想使用'NotEmpty()'來檢查'null'或空字符串。 –

+1

OP明確表示他在使用'FluentValidation'。我不知道我是否有過時的庫,但是這個答案拋出了'System.InvalidOperationException'錯誤信息:屬性名稱無法自動爲表達式person =>(person.FirstName ?? person.LastName)確定。請通過調用'WithName'來指定自定義屬性名稱。 – IronGeek

+0

@IronGeek你說得對。我編輯了答案。改用Zabavsky的解決方案。 –

39

您可以使用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上找到幾個這樣的例子。

+0

我使用'.NotEmpty'和'.When'來顯示客戶端錯誤,我應該怎麼做?我將編輯我的問題,以便您可以查看我添加的新增內容。 – Cybercop

+0

我剛剛意識到它不適用於when和unless。但仍然流利的認證不起作用 – Cybercop

8

試試這個

RuleFor(person => person).Must(person => !string.IsNullOrEmpty(person.FirstName) || !string.IsNullOrEmpty(person.LastName)) 
+0

你自己試過了嗎? – Beatles1692

+1

是的,我的代碼有這樣的一些規則 –

+0

我已經測試它自己,它的工作:) – Beatles1692

4

我不喜歡這樣,以檢查進入收費同以前的一個或沒有。 如果收費與以前相同,則會發生錯誤。這對我有效。

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"); 
    } 
} 
0

RuleFor(人=>人)。必須(人=>!string.IsNullOrEmpty(person.FirstName)||!string.IsNullOrEmpty(person.LastName))。WithName( 「名稱」)