基于验证对象的自定义属性名称

时间:2011-11-10 15:18:16

标签: asp.net-mvc fluentvalidation

我有以下类,例如它们有点简化。

class LineInfo
{   
    Id,
    LineNumber,
    SubAccountNumer,
    MobileNumber
}

class SuspendLinesVM{
    public List<LineInfo> Lines{ get;set; }
}

我在行动中收到SuspendLinesVM,所有行都是从客户端动态创建的。属于表单中具体LineInfo的每个元素都具有名称,其模板为“ lineid {Id} _ElementName ”。所以他们以这样的形式来找我:

lineid0001_LineNumber

lineid0001_SubAccountNumer

lineid0001_MobileNumber

lineid0021_LineNumber

lineid0021_SubAccountNumer

lineid0021_MobileNumber

当验证时发生一些错误时,我需要一种方法来设置失败的属性,因为它要求在视图中突出显示无效字段。

我在困惑的地方留下了问题。

 public class LineInfoValidator: AbstractValidator<LineInfo>
    {
        public LineInfoValidator()
        {
            RuleFor(m => m.LineNumber)
                .NotEmpty().WithMessage("Line # is required").OverridePropertyName( ??? ) 
                .InclusiveBetween(1, 9999).WithMessage("Line # must be in range [1, 9999]").OverridePropertyName( ??? )
...

我需要一种方法来做类似*(instance,propertyName)=&gt; return string.format('lineid_ {0} _ {1}',instance.Id,propertyName)*。

有什么想法吗?

2 个答案:

答案 0 :(得分:2)

使用'WithState'方法解决。感谢Jeremy!他的解决方案是http://fluentvalidation.codeplex.com/discussions/278892

  

<强> JeremyS
  2011年11月10日下午5:16

     

不幸的是,这不是支持的东西。

     

实例化验证器时,属性名称仅解析一次,而执行验证程序时生成的错误消息则不会解析。在这种情况下,您需要检查正在验证的实例以生成属性名称,这实际上是不可能的 - 您能够获得的最接近的是使用WithState方法将某些自定义状态与失败相关联: / p>

RuleFor(x => x.LineNumber)
    .NotEmpty()
    .WithState(instance => string.Format("lineid_{0}_LineNumber", instance.Id));
     

一旦调用验证器并返回ValidationResult,就可以从ValidationFailure上的CustomState属性中检索它。

     

杰里米

答案 1 :(得分:0)

鉴于您正在使用FluentValidator,您应该能够在SuspendedLinesVM对象上设置集合验证器,如下所示:

public class SelectedLinesVMValidator : AbstractValidator<SelectedLinesVM>
{
    public SelectedLinesVMValidator()
    {
        RuleFor(x=>x.Lines).SetCollectionValidator(new LineInfoValidator());
    }
}

如果您这样做,那么as per the documentation您将收到与失败属性的索引相关的错误集合。