【问题标题】:MVC3 cascade dropdown and Json objectMVC3级联下拉和Json对象
【发布时间】:2012-07-09 01:41:22
【问题描述】:

我已经用 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);
}

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

【问题讨论】:

  • 您应该能够使用 firebug 或类似工具来查看您的第一个 SelectCategory 操作的 AJAX 响应。看看它是如何返回 JSON 对象的,并确保你的 JS 匹配它的格式

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


【解决方案1】:

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

我怀疑您的域实体中有循环引用。 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);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-29
    • 1970-01-01
    • 1970-01-01
    • 2018-07-02
    • 1970-01-01
    • 2012-08-21
    • 1970-01-01
    相关资源
    最近更新 更多