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>
    }

データポイントをループして、各データポイントのテキスト ボックスを生成します。これらの各データポイントにはRequiredTextRequiredDecimal、 、 などの異なる検証ルールが関連付けられています。検証を実装するために、ここで説明するようにRange(10, 100)カスタムを作成してみました。ModelValidatorProvider

here で説明されている検証は、通常のモデル フィールドではうまく機能しますが、テキスト フィールドが動的に生成されるデータポイントの場合、これは機能しません。

検証が選択されない理由は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