【问题标题】:How to create cascading drop-down list如何创建级联下拉列表
【发布时间】:2018-04-07 20:58:19
【问题描述】:

我有两个用于过滤的下拉列表。如何将此下拉列表更改为 catchcadaing 下拉列表

 public ActionResult Index()
    {
        REFINED_DBEntities db = new REFINED_DBEntities();
        ViewBag.Subdivision =
            new SelectList(db.Retention_Model_Predictions_DS_Manual.Select(m => m.Subdivision).Distinct().OrderBy(c=>c.ToUpper()),

            "Subdivision");

        ViewBag.UnderwriterName =
            new SelectList(db.Retention_Model_Predictions_DS_Manual.Select(m => m.Underwriter_Name).Distinct(),

                "Underwriter_Name");
        return View();
    }

HTML 视图

<div class="form-group ">
    @Html.DropDownList("Subdivision", (IEnumerable<SelectListItem>)ViewBag.Subdivision, "Select Region", new { @class = "form-control", @id = "subDivision" })

</div>

<div class="form-group ">
    @Html.DropDownList("Underwriter_Name", (IEnumerable<SelectListItem>)ViewBag.UnderwriterName, "Select Underwriter", new { @class = "form-control", @id = "uwriter" })
</div>

【问题讨论】:

  • 有很多方法可以做到这一点。一旦选择了第一个下拉列表来填充第二个下拉列表,您可能想要使用 AJAX 调用。尝试谷歌搜索:“级联下拉菜单”
  • 您从哪里听说过catchcadaing这个词?
  • 这是一个开始的示例。这是针对asp.net核心的,但是概念是一样的stackoverflow.com/questions/46942151/…
  • @Shyju:这是级联的,但谁在乎几个字母;)

标签: jquery asp.net asp.net-mvc


【解决方案1】:

级联下拉菜单的想法是,您在第一个下拉菜单中选择一个值,它会触发一些操作来加载第二个下拉菜单的选项。一个典型的例子是 Country 下拉菜单和 State 下拉菜单。每次用户选择一个国家时,国家下拉菜单都应该更新为该国家下的州。

我将为您提供一个非常通用的 Country-State 用例示例。您可以使用相同的概念来构建您的特定用例

首先,为您的视图创建一个视图模型。创建一个 List&lt;SelectListItem&gt; 类型的属性,用于传递构建 SELECT 元素所需的选项列表,以及另一个用于存储所选选项值的属性。我们将为两个 SELECT 元素执行此操作。

public class CreateUserVm
{
   public List<SelectListItem> Countries { set;get;}
   public int SelectedCountryId { set;get;}

   public List<SelectListItem> States { set;get;}
   public int SelectedStateId { set;get;}  

   public CreateUserVm()
   {
     this.Countries = new List<SelectListItem>();
     this.States = new List<SelectListItem>();
   }  
}

现在在您的 GET 操作方法中,创建此视图模型的对象,初始化第一个下拉菜单的选项,在本例中为 Countries 属性并将其发送到视图。

public ActionResult Create()
{ 
    var vm=new CreateUserVm();
    vm.Countries = GetCountries();
    return View(vm);
}
private List<SelectListItem> GetCountries()
{
    var list = new List<SelectListItem>
    {
        new SelectListItem() {Value = "1", Text = "USA"},
        new SelectListItem() {Value = "2", Text = "India"},
    };
    return list;
}

现在在您的视图中,它是我们视图模型的强类型。我们将使用DropDownListFor 辅助方法来呈现下拉菜单

@model CreateUserVm
@using (Html.BeginForm("Index", "Home"))
{
   @Html.DropDownListFor(a=>a.SelectedCountryId,Model.Countries,"Select one")
   @Html.DropDownListFor(a => a.SelectedStateId, Model.States, "Select one",
                                              new { data_url = Url.Action("GetStates") })
   <input type="Submit" />
}

这将呈现 2 个下拉菜单,一个带有 Country 选项,第二个将为空(因为我们没有向 States 属性加载任何内容)。现在我们将有一些 javascript(我们在这里使用 jquery 以便于 DOM 操作)将监听第一个下拉列表(国家)的 change 事件,读取选定的值并对 GetStates 进行 ajax 调用方法并传递选定的国家选项值。

您可以看到,我为第二个下拉列表设置了一个 html5 数据属性,我将 URL 存储到 GetStates 方法。所以在我的javascript中,我可以简单地读取这个数据属性值并调用那个url来获取数据。

$(function () {
    $("#SelectedCountryId").change(function () {
        var v = $(this).val();
        var url = $("#SelectedStateId").data("url") + '?countryId=' + v;
        var $states = $("#SelectedStateId");
        $.getJSON(url, function (states) {
                $states.empty();
                $.each(states, function (i, item) {
                    $states.append($("<option>").text(item.Text).val(item.Value));
                });
            });    
    });
});

现在,让我们添加一个GetStates 操作方法,该方法接受countryId 并在SelectListItem 列表中以JSON 数组形式返回该国家/地区的状态。

public ActionResult GetStates(int countryId)
{
    var states = new List<SelectListItem>();
    if (countryId == 1)
    {
        states.Add(new SelectListItem() {Value = "101", Text = "Michigan"});
        states.Add(new SelectListItem() { Value = "102", Text = "New York" });
    }
    else if (countryId == 2)
    {
        states.Add(new SelectListItem() { Value = "103", Text = "Kerala" });
        states.Add(new SelectListItem() { Value = "104", Text = "Goa" });

    }
    return Json(states, JsonRequestBehavior.AllowGet);
}

在这里,我对国家和州进行了硬编码。但是,如果您有一个包含这些数据的数据库,请将硬编码的值替换为表中的数据。

在编辑记录时,您只需根据保存的 CountryId 在 GET 操作中加载 States 属性。

【讨论】:

  • public AcitonResult Create() 中的拼写错误应该是 public ActionResult Create()。 还有一个错误“并非所有代码路径都返回值”公共 ActionResult Create() { var vm = new CreateUserVm(); vm.Countries = GetCountries(); }
  • 您将如何使用实体框架实现上述解决方案?
  • 修复了错字和缺少的返回语句。您使用什么数据访问技术并不重要。一旦您使用了上述方法(硬编码值),您所要做的就是用来自表的动态数据替换硬编码项。 Stackoverflow 中有很多这样的例子。这是一个开始stackoverflow.com/questions/34624034/… (请参阅使用实体框架从数据库表中获取数据部分的答案)
  • 谢谢。我如何使用 JQuery 而不是 JavaScript 来实现上述功能?
  • jQuery 是一个 JavaScript 库。上面的代码使用 jQuery 进行简单的 DOM 操作
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多