2012-03-15 44 views
0

我想在我的MVC3剃鬚刀應用程序中顯示一個下拉框,用戶可以從中選擇類別並根據他的選擇我想顯示覆選框的子類別,以便用戶可以選擇多個子類別。Ho根據用戶從下拉列表中選擇顯示多個複選框選擇?

任何人都可以幫助我如何得到這個?

下面是我從Web服務收到的JSON,並且我將它反序列化爲對象,那麼如何將該對象分配給兩個不同的列表類別(下拉列表)和子類別(複選框)?

JSON:

{ 
"Code":0, 
"Status":"Done", 
"Categories":[ 
{ 
    "ID":1, 
    "Name":"Eat", 
    "Subcategories":[ 
     {"Flag":false,"ID":100,"Name":"Food"}, 
     {"Flag":false,"ID":101,"Name":"Fast Food"},   
     {"Flag":false,"ID":102,"Name":"Other"} 
    ] 
     }, 
    { 
    "ID":2, 
    "Name":"Entertainment", 
    "Subcategories":[ 
     {"Flag":false,"ID":100,"Name":"All"},    
     {"Flag":false,"ID":101,"Name":"Movie"}, 
     {"Flag":false,"ID":102,"Name":"Other"} 
    ] 
    }, 
    } 
    ] 
    } 

實體:

public class MyData 
{ 
    public int Code { get; set; } 
    public string Status { get; set; } 
    public List<Category> Categories { get; set; } 
} 

public class Category 
{ 
    public string Name { get; set; } 
    public int ID { get; set; } 
    public List<Subcategory> Subcategories { get; set; } 
} 

public class Subcategory 
{ 
    public string Name { get; set; } 
    public int ID { get; set; } 
    public bool Flag { get; set; } 
} 
+0

你的意思是你想負荷子類別作爲基於選擇的類別的複選框列表?你是否需要點擊數據庫來加載子類別? – 2012-03-15 20:42:15

+0

http://code.google.com/p/dropdown-check-list/或http://harvesthq.github.com/chosen/ – elclanrs 2012-03-15 20:43:43

+0

hide/show如何使用類系統或ID系統非常簡單匹配值的選擇...樣本的HTML將有所幫助..更好的目標描述也將有助於 – charlietfl 2012-03-15 20:45:37

回答

1

你可以使用AJAX。訂閱下拉列表的更改事件並觸發AJAX請求傳遞給沿選定類別傳遞的控制器操作。該操作將查詢數據庫中相應的子類別,並返回一個部分視圖和相應的複選框,這些複選框將被注入到DOM中。

因此,讓我們假設你已經在你的視圖的類別一個下拉列表:

@Html.DropDownListFor(
    x => x.CategoryId, 
    Model.Categories, 
    new { 
     id = "categories", 
     data_subcategoriesurl = Url.Action("subcategories", "somecontroller") 
    } 
) 

和一些DIV將某處包含的子類別頁面上:

<div id="subcategories"> 
    @Html.EditorFor(x => x.SubCategories, "SubCategories") 
</div> 

,你可以然後有一個SubCategories.cshtml部分將呈現複選框列表:

@model IList<CategoryViewModel> 
@{ 
    // we change the HTML field prefix so that input elements 
    // such as checkboxes have correct names in order to be able 
    // to POST the values back 
    ViewData.TemplateInfo.HtmlFieldPrefix = "SubCategories"; 
} 
@for (var i = 0; i < Model.Count; i++) 
{ 
    <div> 
     @Html.LabelFor(x => x[i].IsSelected, Model.CategoryName) 
     @Html.CheckBoxFor(x => x[i].IsSelected) 
    </div> 
} 

現在,您可以訂閱下拉的變化事件在一個單獨的JavaScript文件:

$(function() { 
    $('#categories').change(function() { 
     var subcategoriesUrl = $(this).data('subcategoriesurl'); 
     var selectedCategoryId = $(this).val(); 
     $('#subcategories').load(subcategoriesUrl, { id: selectedCategoryId }); 
    }); 
}); 

終於SubCategories行動將與AJAX調用:

public ActionResult SubCategories(int? id) 
{ 
    var subCategories = Repository.GetSubCategories(id); 
    return View(subCategories); 
} 
+0

我正在對我的應用程序進行安寧的調用以獲取類別和子類別,因此,獲取它們並顯示類別下拉的最佳方法是什麼?你能解釋一下,當我得到傑森的反應,我將反序列化該對象,那麼我應該如何獲得類別/子類別值到我的viewmodel,所以我可以顯示它們時用戶調用(GET)這些類別將顯示在一起的頁面其他文本框,並且一旦用戶提交表單,則會將所有選擇與其他文本框值一起發佈。 – updev 2012-03-16 19:20:42

+0

@updev,這裏有兩種可能的方法:要麼使用AJAX來查詢您的RESTful服務,它將返回JSON,然後填充下拉選項(最初將呈現爲空),或讓您的控制器操作查詢服務或直接存儲庫來填充視圖模型,該視圖模型將被傳遞給視圖,然後使用DropDownListFor幫助器(這是我在回答中顯示的內容)將其呈現爲下拉列表。就子類別而言,使用AJAX似乎是必要的,因爲您希望每次選擇更改時刷新此複選框列表。 – 2012-03-16 20:54:16

+0

您可以幫助您爲此場景定義Model/ViewModel嗎? – updev 2012-03-19 15:44:47

相關問題