2012-07-09 61 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); 
}