0

複数の再利用可能な要素を使用してビルドしようとしている MVC3 カミソリ プロジェクトがあります。次のような多くのモデルクラスがあります

public class ProductCreateModel
    {
        [Required]
        [Display(Name = "Org")]
        [UIHint("MyOrgsDropDown")]
        public string orgName { get; set; }

        [Required(ErrorMessage = "Select an account")]
        [Display(Name = "Account")]
        [UIHint("MyAccountsDropDown")]
        [AdditionalMetadata("orgFieldId", "orgName")]
        [AdditionalMetadata("fieldId", "accountName")]
        public string accountName { get; set; }
    }

この例では省略している他のフィールドがあります

MyAccountsDropDown.cshtml は次のようになります。

@{  
var values = ViewData.ModelMetadata.AdditionalValues;
string orgFieldId = (string)values["orgFieldId"];
string fieldId = (string)values["fieldId"];
}
<script type="text/javascript">
$(document).ready(function () {
    $("#@orgFieldId").change(function () {
        var idProd = $(this).val();
        $.getJSON("/JsonService/GetAccounts", { orgId: idProd },
            function (myData) {
                var select = $("#@fieldId");
                select.empty(); 
                $.each(myData, function (index, itemData) {
                    select.append($('<option/>', {
                        value: itemData.Value,
                        text: itemData.Text
                    }));
                });
            });
    });
});
</script>


@Html.DropDownList("", new SelectList(Enumerable.Empty<SelectListItem>(), "Value", "Text"), "---Select---", new { id = fieldId })

私のコントローラーメソッドは次のようになります。

    [HttpGet]
    public ActionResult AddProduct()
    {
        return PartialView("_AddProduct");
    }

    [HttpPost]
    public ActionResult AddProduct(ProductCreateModel model)
    {
        if (!ModelState.IsValid)
        {
            return PartialView("_AddProduct", model);
        }

        //do some stuff

        return PartialView("_AddProduct");
    }

したがって、ビューが (jQuery ダイアログ ボックスとして) 開くと、フォームがすべて設定されます。orgName を選択すると、データベースから accountName がプルされます (カスケード)。モデル検証を使用しているため、すべての必須フィールドに入力せずに送信を押すと、検証メッセージが表示されます。また、送信前に入力したフィールドの事前入力値も表示されます。削除されるのは、カスケードされたドロップダウン値です。そのため、選択された orgName は引き続き表示されますが、accountName ドロップダウンは以前に入力された値をデータベースから失います。

送信がクリックされる前に既にプルされた SelectItems を維持するにはどうすればよいですか

4

1 に答える 1

0

JavaScript セクションのコードを次のように変更します。

  $("#@orgFieldId").change(function () {
      var idProd = $(this).val();
      $.getJSON("/JsonService/GetAccounts", { orgId: idProd },
          function (myData) {
              var select = $("#@fieldId");
              select.empty(); 
              $.each(myData, function (index, itemData) {
                  select.append($('<option/>', {
                      value: itemData.Value,
                      text: itemData.Text
                  }));
              });
          });
  });

  $(document).ready(function () {
    $("#@orgFieldId").change();
  });
于 2012-05-23T21:52:07.643 に答える