我正在创建一个表单,其中一些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)
等。为了实现验证,我尝试按照{{3}创建自定义ModelValidatorProvider
}。
此处所述的验证对于普通模型字段非常有用,但在数据点的情况下,动态生成文本字段,这不起作用。
未获取验证的原因是modelMetadata
未获得动态字段的正确选择,并且我没有在类GetValidators
的方法XmlModelValidatorProvider
中获取元数据propertyName,如链接中所述我提到。
我确信我想要实现的是一种常见的要求,MVC
必须有更好的方法来实现这一目标,但我不确定我所尝试的是正确还是简单的愚蠢。
请在我当前的方法或其他适合此案例的方法中提出错误。
编辑:
添加一些关于我目前的验证提供程序类的信息:
public class XmlModelValidatorProvider : ModelValidatorProvider
{
public readonly Dictionary<string, Type> _validatorTypes;
...
public override IEnumerable<ModelValidator> GetValidators(ModelMetadata metadata, ControllerContext context)
{
....
}
此课程的更多详细信息可以是here