MVC3级联下拉和JSON对象
问题描述:
我实现了我的级联下拉列表与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);
}
貌似转换我的实体,我从数据源到适当的格式获得的问题。 执行此操作的正确方法是什么?
答
什么是正确的方式来实现这个?
我怀疑你的域实体中有循环引用。这不受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);
}
你应该能够使用萤火虫或类似的看到你的第一选择分类Ajax响应行动。看看它是如何返回JSON对象,并确保你的JS匹配它的格式 – Daveo 2012-07-09 01:55:40