Вы можете использовать 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);
}