MVC3级联下拉列表和Json对象

时间:2012-07-09 01:41:23

标签: json asp.net-mvc-3 drop-down-menu

我已经用MVC3实现了我的级联下拉列表,几乎完全按照

中的说明

Easiest way to create a cascade dropdown in ASP.NET MVC 3 with C#

我的观点有那个

<script type="text/javascript">
    $(function () {
        $('#CategoryID').change(function () {
            var selectedCategoryId = $(this).val();
            $.getJSON('@Url.Action("SelectCategory")', { categoryid: selectedCategoryId }, function (subcategories) {
                var subsSelect = $('#SubCategoryID');
                subsSelect.empty();
                $.each(subcategories, function (index, subcat) {
                    subsSelect.append(
                        $('<option/>')
                            .attr('value', subcat.SubCategoryID)
                            .text(subcat.SubCategoryName)
                    );
                });
            });
        });
    });
</script>

我的控制器有那个

public ActionResult SelectCategory(int categoryid)
{
    var subs = db.SubCategories.Where(s => s.CategoryID == categoryid).ToList();
    return Json(subs, JsonRequestBehavior.AllowGet);
}

这不起作用。

但是,当我按照以下方式修改控制器时,它可以工作:

public class JsonSubCat
{
    public int SubCategoryID { get; set; }
    public string SubCategoryName { get; set; }
}

public ActionResult SelectCategory(int categoryid)
{
    var subs = db.SubCategories.Where(s => s.CategoryID == categoryid).ToList();
    var testsubs = new List<JsonSubCat>();

    foreach (var sub in subs)
    {
        testsubs.Add(new JsonSubCat() { SubCategoryID = sub.SubCategoryID, SubCategoryName = sub.SubCategoryName });
    }

    return Json(testsubs, JsonRequestBehavior.AllowGet);
}

看起来像是将我从数据源获取的实体转换为正确格式的问题。 实现这个的正确方法是什么?

1 个答案:

答案 0 :(得分:3)

  

实现这个的正确方法是什么?

我怀疑您的域实体中有循环引用。 JSON序列化程序不支持此功能,因为JSON格式不支持循环结构。

您不应将域模型传递给视图。请停止这样做并使用视图模型。当这个视图关注的是文本和值的集合时,为什么要将整个subs实体传递给视图?这都是下拉列表所需要的。

所以使用视图模型,更不用说你已经写了一个=&gt; JsonSubCat这个很棒的课程:

public ActionResult SelectCategory(int categoryid)
{
    var subs = db.SubCategories
        .Where(s => s.CategoryID == categoryid)
        .ToList()
        .Select(x => new JsonSubCat
        {
            SubCategoryID = x.SubCategoryID,
            SubCategoryName = x.SubCategoryName
        });
    return Json(subs, JsonRequestBehavior.AllowGet);
}