以下のような複雑なクラス構造があります。
public class Account
{
public List<Name> Person {get;set;}
public List<Address> Address {get;set;}
public string Email {get;set;}
public string ConfirmEmail {get;set;}
}
public class Name
{
public string FirstName {get; set;}
public string LastName {get;set;}
public string DateOfBirth {get;set;}
public string SSN {get;Set;}
}
public class Address
{
public string AddressLine1 {get;set;}
public string AddressLine2 {get;set;}
public string City {get;set;}
public string State {get;set;}
}
ここにバリデーターがあります
public class AccountValidator : AbstractValidator<Account>
{
public AccountValidator()
{
RuleSet("Account", () =>
{
RuleFor(account => account.Person).SetCollectionValidator(new NameValidator());
RuleFor(account => account.Address).SetCollectionValidator(new AddressValidator());
});
}
}
}
public class NameValidator : AbstractValidator<Name>
{
public NameValidator()
{
RuleSet("Account", () =>
{
SharedRules();
});
RuleSet("Name_DateOfBirth", () =>
{
SharedRules();
RuleFor(name => name.DateOfBirth).NotEmpty());
});
}
void SharedRules()
{
RuleFor(name => name.FirstName).NotEmpty());
RuleFor(name => name.FirstName).Length(1, 20));
RuleFor(name => name.LastName).NotEmpty());
RuleFor(name => name.LastName).Length(1, 20));
}
}
public class AddressValidator : AbstractValidator<Address>
{
public AddressValidator()
{
RuleSet("Account", () =>
{
SharedRules();
});
}
void SharedRules()
{
RuleFor(address => address.AddressLine1).NotEmpty());
...
.... etc..
}
}
私は以下のように[HttpPost] ActionMethodを持っています:-
[HttpPost]
public ActionResult Register([CustomizeValidator(RuleSet="Account")] Account model)
{
if(MoelState.IsValid)
{
//blah blah
}
else
{
//blah blah
}
}
私は次のように登録用のビューを持っています:-
@using (Html.BeginForm(null, null, FormMethod.Post, new { id = "Register" }))
{
@Html.AntiForgeryToken();
<h1>Register</h1>
@Html.ValidationSummary(false)
<div id="divName">
@Html.EditorFor(m => m.Person[0])
</div>
for (int i = 0; i < 2; i++)
{
if (i == 0)
{
<div id="divHomeAdd">
@Html.EditorFor(m => m.Address[0])
</div>
<input type="checkbox"/>
<label for="nohomeaddress"> Do not Have Home Address </label>
}
if (i == 1)
{
<div id="divMailingAdd">
@Html.EditorFor(m => m.Address[1])
</div>
}
}
@Html.TextBoxCustomFor(m => m.Email)
@Html.TextBoxCustomFor(m => m.ConfirmEmail)
<input type="submit" value="Register" id="btnRegister" name="Register" />
}
EditorFor() Name を表示する必要がありますが、必要なのは FirstName と LastName のみです。つまり、NameValidator で「Account」の RuelSet を起動する必要があります。
一部のその他のビューでは、「Name_DateOfBirth」RuleSet を起動する必要があります。これは、その画面で、通常の名と姓に加えて必須フィールドとして生年月日が必要なためです。MVC でそれを行う方法は?
「自宅住所なし」のチェックボックスがオンになっている場合は、自宅住所の検証を表示する必要があり、郵送先住所プロパティを検証するだけで済みます。
このようなシナリオでルールセットを利用するにはどうすればよいですか? 親と子で同じルール名が必要ですか? つまり、「アカウント」ルールは、AccountValidator と NameValidator の両方に存在して、起動する必要がありますか?