我正在创建一个表单,其中一些HTML
字段在运行时根据数据库值生成,然后我想向它们添加验证。我现在的场景是这样的:
模型:
public class MeasureModel
{
[Required]
[DisplayName("Measure Name")]
public int? MeasureName
{
get;
set;
}
[DisplayName("Install Date")]
[Required]
[DataType(DataType.Date)]
public DateTime? InstallDate
{
get;
set;
}
public List<Datapoint> Datapoints { get; set; }
}
public class Datapoint
{
public string DatapointTypeName { get; set; }
public string DatapointTypeLabel { get; set; }
public string Value { get; set; }
public string ValidationRule { get; set; }
}
我的看法是这样的:
@Html.TextBoxFor(m => m.JobCost)
@Html.ValidationMessageFor(m => m.JobCost)
@for (int i = 0; i < Model.Datapoints.Count; i++)
{
<div class="editor-label">
@Model.Datapoints[i].DatapointTypeLabel
@Html.HiddenFor(model => model.Datapoints[i].DatapointTypeName)
</div>
<div class="editor-field">
@Html.TextBoxFor(model => model.Datapoints[i].Value)
</div>
}
我遍历数据点为每个数据点生成文本框。这些数据点中的每一个都有与之关联的不同验证规则,例如、、RequiredText
等。为了实现验证,我尝试按照此处所述创建自定义。RequiredDecimal
Range(10, 100)
ModelValidatorProvider
此处描述的验证对普通模型字段非常有效,但对于动态生成文本字段的数据点,这不起作用。
未选择验证的原因modelMetadata
是没有为动态字段正确选择,并且我没有在我提到的链接中描述GetValidators
的类方法中获取元数据 propertyName。XmlModelValidatorProvider
我确信我想要实现的是一种常见的要求,并且MVC
必须有一些更好的方法来实现这一点,但我不确定我正在尝试的是正确的还是愚蠢的。
请提出我目前的方法或适合这种情况的其他方法有什么错误。
编辑:
添加一些关于我目前拥有的验证提供程序类的信息:
public class XmlModelValidatorProvider : ModelValidatorProvider
{
public readonly Dictionary<string, Type> _validatorTypes;
...
public override IEnumerable<ModelValidator> GetValidators(ModelMetadata metadata, ControllerContext context)
{
....
}