Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 3 层叠下拉列表在post后丢失所选项目_Asp.net Mvc 3_Cascadingdropdown_Model Validation - Fatal编程技术网

Asp.net mvc 3 层叠下拉列表在post后丢失所选项目

Asp.net mvc 3 层叠下拉列表在post后丢失所选项目,asp.net-mvc-3,cascadingdropdown,model-validation,Asp.net Mvc 3,Cascadingdropdown,Model Validation,我有一个MVC3 razor项目,我正在尝试使用多个可重用元素构建它。我有很多模型类,如下所示 public class ProductCreateModel { [Required] [Display(Name = "Org")] [UIHint("MyOrgsDropDown")] public string orgName { get; set; } [Required(ErrorMessage =

我有一个MVC3 razor项目,我正在尝试使用多个可重用元素构建它。我有很多模型类,如下所示

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。现在,由于我正在使用模型验证,当我没有填写所有必填字段并按submit时,它会显示验证消息。它还显示了我在提交之前已经输入的字段的预填充值。所删除的是级联下拉值。因此,它将继续显示选定的orgName,但accountName下拉列表将丢失数据库中以前填充的值


如何维护单击提交之前已提取的SelectItems?将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();
  });