我有以下类,例如它们有点简化。
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)*。
有什么想法吗?
答案 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您将收到与失败属性的索引相关的错误集合。