2012-07-09 54 views
1

我实现了我的级联下拉列表与MVC3几乎完全在MVC3级联下拉和JSON对象

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

貌似转换我的实体,我从数据源到适当的格式获得的问题。 执行此操作的正确方法是什么?

+0

你应该能够使用萤火虫或类似的看到你的第一选择分类Ajax响应行动。看看它是如何返回JSON对象,并确保你的JS匹配它的格式 – Daveo 2012-07-09 01:55:40

回答

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