1

以下のような複雑なクラス構造があります。

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 の両方に存在して、起動する必要がありますか?

4

1 に答える 1

1

これまでのところ、良いスタートのように見えます。ビュー名をルールセット名として使用することは、どのフィールドがビュー上にあり、どのフィールドが検証されるかの間に良い関係があるため、良い考えです。

私が気付いた唯一のことはValidatorAttribute、モデル クラスの装飾が欠落していることです。

まだ見ていない場合は、ここにいくつかの優れたドキュメントがあります。

于 2013-06-18T21:52:02.217 に答える