Fluent验证复杂属性消息显示其中的复杂属性名称

时间:2013-06-21 13:38:30

标签: validation asp.net-mvc-4 server-side fluent fluentvalidation

嗨,我有这样的课程结构

public class Order
{
   public Address OfficeAddress {get;set;}
}

public class Address
{
  public string ID {get;set;}
  public string Street1 {get;set;}
  public string street2 {get;set;}
  public string City {get;set;}
  public string State {get;set;}
  public string ZipCode {get;set;}
}

我有订单验证器,如下所示

public OrderValidator : AbstractValidator<Order>
{
  public OrderValidator()
  {
        Custom(Order =>
        {
            //Did some custom validation...works fine.
        });

    RuleFor(o => o.OfficeAddress.StreetLine1)
                 .Cascade(CascadeMode.StopOnFirstFailure)
                 .NotEmpty().WithLocalizedMessage(() => Myresource.required)
                 .Length(1, 60).WithLocalizedMessage(() => Myresource.maxLength)
                 .Unless(o => null == o.OfficeAddress);
  }
}

我的消息显示如下

 Office Address. Street Line1 is required

为什么会附加“办公地址”以及它为何拆分了属性名称? 我的资源消息就像这样{PropertyName}是必需的。现在我怎么能告诉它不要给我看“Office Address。”并且不要拆分它。

我在其他视图中有类似的复杂地址属性,但它在那里工作正常,我不知道为什么。唯一不同的是所有其他验证器都定义了RuleSet,并且在其中我验证地址相似但在上面它不在RuleSet中。这里为控制器Post Action方法中的View,即使我没有提到[CustomizeValidator(RuleSet = "RuleSetName")],因为我上面有自定义验证。不确定这是不是问题。

即使我决定使用RuleSet,我可以在同一个Validator中使用“RuleSet”和Custom Validator吗?如果是,那么我应该将RuleSet命名为“地址”?并使用相同的名称标记Action MEthod,它将同时调用Custom和“Address”RuleSet?

1 个答案:

答案 0 :(得分:1)

您应该为Address类定义一个单独的验证器:

public class AddressValidator: AbstractValidator<Address>
{
    public void AddressValidator()
    {
        this
            .RuleFor(o => o.StreetLine1)
            .Cascade(CascadeMode.StopOnFirstFailure)
            .NotEmpty().WithLocalizedMessage(() => Myresource.required)
            .Length(1, 60).WithLocalizedMessage(() => Myresource.maxLength)
            .Unless(o => null == o);
    }
}

然后在OrderValidator中:

public OrderValidator : AbstractValidator<Order>
{
    public OrderValidator()
    {
        Custom(Order =>
        {
            //Did some custom validation...works fine.
        });

        this
            .RuleFor(o => o.OfficeAddress)
            .SetValidator(new AddressValidator());
    }
}