根据其他下拉列表的选择填充一个下拉列表

时间:2014-04-10 15:22:31

标签: jquery asp.net-mvc json html.dropdownlistfor

我正在尝试根据其他下拉列表的选择填充一个下拉列表。这就是我现在所拥有的。

这是作为参数接收第一个下拉列表的选定值的函数:

  [AcceptVerbs(HttpVerbs.Get)]
    public JsonResult GetTownsForCounty(string selectedCounty)
    {

        List<SelectListItem> list = new List<SelectListItem>();
        list.Add(new SelectListItem{Text=selectedCounty+"1", Value=selectedCounty+"1", Selected=false});
        list.Add(new SelectListItem{Text=selectedCounty+"2", Value=selectedCounty+"2", Selected=false});
        list.Add(new SelectListItem{Text=selectedCounty+"3", Value=selectedCounty+"3", Selected=false});

        var dropdowndata = list;

        return Json(dropdowndata, JsonRequestBehavior.AllowGet);
    }

在视图中:

@Html.DropDownListFor(item => item.County, counties)
@Html.DropDownListFor(item => item.Town, new List<SelectListItem>())

我的javascript:

    $.get("/Subscription/GetTownsForCounty", { selectedCounty: county }, function (dropdowndata) {
        console.log(dropdowndata)

        var select = $("#Town");
        select.empty();
        $.each(dropdowndata, function (index, itemData) {
            select.append($('<option/>', {
                value: itemData.Value,
                text: itemData.Text
            }));
        });

    });

我做错了什么?

如果我从路线配置中删除下一行,它可以工作:

  routes.MapRoute(name: "Subscription", 
    url: "subscription/{id}/{name}",
    defaults: new {
      controller="Subscription",
      action="Index",
      id=UrlParameter.Optional,
      name=UrlParameter.Optional});

如果没有,响应(dropdowndata)是页面的html。为什么呢?

2 个答案:

答案 0 :(得分:2)

回答有关路线的问题:

您删除的路线为subscription/{id}/{name},这意味着当您尝试申请/Subscription/GetTownsForCounty时,它会尝试将GetTownsForCountry作为Id参数传递到索引操作,而不是调用GetTownsForCountry操作。当您删除此内容时,它可能会回退到{controller}/{action}/{id}的默认路由,以便您的请求调用正确的操作。

重点:

您正在尝试返回不正确的JSON序列化SelectListItems。您应该只将原始数据作为JSON返回,并在客户端上构建选择选项。它仍然可以使用SelectListItem,因为它最终只是创建具有这些属性的对象,但你真的不应该这样做,因为你有效地创建控件,转向数据,转向控件,不是一个好的模式。

[AcceptVerbs(HttpVerbs.Get)]
public JsonResult GetTownsForCounty(string selectedCounty)
{

    List<object> list = new List<object>();
    list.Add(new {Text=selectedCounty+"1", Value=selectedCounty+"1"});
    list.Add(new {Text=selectedCounty+"2", Value=selectedCounty+"2"});
    list.Add(new {Text=selectedCounty+"3", Value=selectedCounty+"3"});

    return Json(list, JsonRequestBehavior.AllowGet);
}

答案 1 :(得分:0)

没有理由在控制器上生成SelectList,因为这是一个视图问题。

尝试

[AcceptVerbs(HttpVerbs.Get)]
public JsonResult GetTownsForCounty(string selectedCounty)
{
    var list = new List<object>();
    list.Add(new object { Text = selectedCounty + "1", Value = selectedCounty + "1" });
    list.Add(new object { Text = selectedCounty + "2", Value = selectedCounty + "2" });
    list.Add(new object { Text = selectedCounty + "3", Value = selectedCounty + "3" });
    return Json(list, JsonRequestBehavior.AllowGet);
}