如何在mvc中使用级联下拉列表

时间:2013-08-16 09:49:50

标签: asp.net-mvc-3

我正在使用asp.net mvc3,我有2个表,我希望从下拉列表中获取数据,基于此另一个下拉列表必须执行。例如,如果我选择国家,它必须显示属于该国家/地区的状态,正在使用控制器中的以下代码。

ViewBag.country= new SelectList(db.country, "ID", "Name", "--Select--");
 ViewBag.state= new SelectList("", "stateID", "Name");

   @Html.DropDownListFor(model => model.Country, (IEnumerable<SelectListItem>)ViewBag.country, "-Select-")

   @Html.DropDownListFor(model => model.state, (IEnumerable<SelectListItem>)ViewBag.state, "-Select-")

但使用此功能只能获得国家/地区。

3 个答案:

答案 0 :(得分:0)

有一个很好的jQuery plugin可以帮助解决这个问题......

每当有人更改国家/地区下拉菜单时,您都不想刷新整个页面 - 只需更新状态下拉菜单的ajax调用就会更加用户友好。

答案 1 :(得分:0)

Jquery Ajax是这类问题的最佳选择。

脚本代码如下所示

<script type="text/javascript">
     $(function() {
            $("#@Html.FieldIdFor(model => model.Country)").change(function() {
                var selectedItem = $(this).val();
                var ddlStates = $("#@Html.FieldIdFor(model => model.state)");

                $.ajax({
                    cache:false,
                    type: "GET",
                    url: "@(Url.Action("GetStatesByCountryId", "Country"))",
                    data: "countryId=" ,
                    success: function (data) {
                        ddlStates.html('');
                        $.each(data, function(id, option) {
                            ddlStates.append($('<option></option>').val(option.id).html(option.name));//Append all states to state dropdown through returned result
                        });
                        statesProgress.hide();
                    },
                    error:function (xhr, ajaxOptions, thrownError){
                        alert('Failed to retrieve states.');
                        statesProgress.hide();
                    }  
                });
            });
        });
</script>

控制器:

public ActionResult GetStatesByCountryId(string countryId)
        {
            // This action method gets called via an ajax request
            if (String.IsNullOrEmpty(countryId))
                throw new ArgumentNullException("countryId");

            var country = GetCountryById(Convert.ToInt32(countryId));
            var states = country != null ? GetStatesByConutryId(country.Id).ToList() : new List<StateProvince>();//Get all states by countryid
            var result = (from s in states
                          select new { id = s.Id, name = s.Name }).ToList();

            return Json(result, JsonRequestBehavior.AllowGet);
        }

答案 2 :(得分:0)

试试这个,

<script type="text/javascript">
    $(document).ready(function () {
        $("#Country").change(function () {

            var Id = $("#Country").val();
            $.ajax({
                url: '@Url.Action("GetCustomerNameWithId", "Test")',
                type: "Post",
                data: { Country: Id },
                success: function (listItems) {
                    var STSelectBox = jQuery('#state');
                    STSelectBox.empty();
                    if (listItems.length > 0) {
                        for (var i = 0; i < listItems.length; i++) {
                            if (i == 0) {
                                STSelectBox.append('<option value="' + i + '">--Select--</option>');
                            }
                            STSelectBox.append('<option value="' + listItems[i].Value + '">' + listItems[i].Text + '</option>');

                        }

                    }
                    else {
                        for (var i = 0; i < listItems.length; i++) {
                            STSelectBox.append('<option value="' + listItems[i].Value + '">' + listItems[i].Text + '</option>');

                        }
                    }
                }


            });

        });
});
</script>

查看

@Html.DropDownList("Country", (SelectList)ViewBag.country, "--Select--")
    @Html.DropDownList("state", new SelectList(Enumerable.Empty<SelectListItem>(), "Value", "Text"), "-- Select --")

<强>控制器

  public JsonResult GetCustomerNameWithId(string Country)
        {
            int _Country = 0;
            int.TryParse(Country, out _Country);
            var listItems = GetCustomerNameId(_Country).Select(s => new SelectListItem { Value = s.CountryID.ToString(), Text = s.CountryName }).ToList<SelectListItem>();
            return Json(listItems, JsonRequestBehavior.AllowGet);
        }