1

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

使用 C# 在 ASP.NET MVC 3 中创建级联下拉列表的最简单方法

我的观点是

<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);
}

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

4

1 回答 1

3

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

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

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

所以使用视图模型,更不用说你已经写了一个 =>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);
}
于 2012-07-09T06:25:28.133 回答