0

これが私の Product および ProductItem クラス/モデルです:

    public class Product
        {
            public int ProductId { get; set; }
            [Required(ErrorMessage="Enter Name")]
            public string Name { get; set; }
            public List<ProductItem> productitems { get; set; }
            [Required(ErrorMessage="Enter Price")]
            public decimal Price { get; set; }
        }
    public class ProductItem
        {
            [Required(ErrorMessage="Select Raw Material")]
            public int RawMaterial { get; set; }
            [Required(ErrorMessage="Enter Quantity")]
            public decimal Qty { get; set; }
        }

ProductItem については、ここでわかるように、jQuery を使用してそのフィールドを動的に追加しています。

$("#btnAddProductItem").click(function () {
        $.getJSON("/rawmaterial/GetRawMaterials", null, function (data) {
            var productItem = $("<tr class='productItem' id='productItem-0'><td><select id='rmlist-0' name='productitems[0].RawMaterial'></select><span class='field-validation-valid' data-valmsg-for='productitems[0].RawMaterial' data-valmsg-replace='true'></span></td><td><input type='text' id='rmqty-0' name='productitems[0].Qty'/><span class='field-validation-valid' data-valmsg-for='productitems[0].Qty' data-valmsg-replace='true'></span></td></tr>");
            $("#productItem").append(productItem);
            $("#rmlist-0").addItems(data);
        });
    });

Name と Price に適用された検証属性は正常に機能していますが、動的に追加されたフィールド (つまり、「RawMaterial」と「Qty」) では機能していません。

この検証がどのように機能するかを教えてください。

注: テスト目的で、0 でインデックス付けされたリストの最初のオブジェクトを追加しました。

4

1 に答える 1

1

これを達成するにはいくつかの方法があります -

  1. 部分的なビュー:クラス定義からわかるように、サーバー側のデータ注釈を使用しているため、js で動的にロードすることはお勧めできません。MVC 4 が自動的に作成した可能性のあるすべての検証を見逃してしまうからです。したがって、私が提案する最善の解決策は、部分ビュー ファイルに動的に追加するコードを取得し、ajax 呼び出しで html を取得してから HTML に入力することです。

  2. JS 検証:ただし、JS を使用する必要がある場合は、すべての検証項目を自分で追加する必要があります。そのためには、いくつかの追加作業を行う必要があります -

    • まず、任意の開発者ツールを使用して HTML を調べます。<span>各項目の後に属性が追加され、ターゲットが言及されているエラーを表示していることがわかります。同様の属性を要素に追加する必要があります

    • MVC 4 控えめな検証では、すべての検証属性とルールが、data属性を持つターゲット要素に追加されます。それぞれは、それらが表す検証に基づいています。それに似た属性を作成してもらいます。

    • 最後に、JS にすべての検証項目を追加した後、フォームをリセットして、追加された新しい検証を解析し、それに応じて機能するようにします。検証を解析するコードはここにあります -

      var form = $("form") //use more specific selector if you like
      form.removeData("validator").removeData("unobtrusiveValidation");
      $.validator.unobtrusive.parse(form);
      

ただし、再作業が最小限で済み、すべての検証を 1 か所に保持するオプションも提供されるため、部分ビュー ソリューションをお勧めします。今後 js に移植される新しい検証について心配する必要はありません。

于 2014-06-03T18:43:49.810 に答える