4

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

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) => return string.format('lineid_{0}_{1}', instance.Id, propertyName)*。

有任何想法吗 ?

4

2 回答 2

2

用“WithState”方法解决。感谢杰里米!他的解决方案在这里http://fluentvalidation.codeplex.com/discussions/278892


2011 年 11 月 10 日下午5:16

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

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

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

调用验证器并取回 ValidationResult 后,您可以从 ValidationFailure 的 CustomState 属性中检索它。

杰里米

于 2011-11-11T10:43:59.633 回答
0

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

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

如果您这样做,那么根据文档,您将获得与失败属性的索引相关的错误集合。

于 2011-11-10T20:16:27.450 回答