1

我正在创建一个表单,其中一些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等。为了实现验证,我尝试按照此处所述创建自定义。RequiredDecimalRange(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)
           {
            ....
    }

可以在此处找到此类的更多详细信息

4

0 回答 0