У меня есть приложение инвентаризации в макете, подобном этому:
<body>
<div class="container" style="width: 100%">
<div id="header"> blahblahblah </div>
<div class="row">
<div id="rendermenu" class="col-sm-2">
@Html.Action("Menu", "Nav")
</div>
<div id="renderbody" class="col-sm-10">
@RenderBody()
</div>
</div>
</div>
В контроллере Home
есть метод действия, который фильтрует репозиторий, отправленный представлению:
public ActionResult Index(string categoria, string marca)
{
InventarioViewModel viewModel = new InventarioViewModel
{
Inventario = repository.GetInventario()
.Where(i => (categoria == null || i.Item.Categoria == categoria)
&& (marca == null || i.Item.Marca == marca))
.OrderBy(i => i.Qta > 0)
.ThenBy(i => i.Item.Categoria)
.ThenBy(i => i.Item.Marca)
.ThenBy(i => i.Item.Modello).ToList(),
CategoriaCorrente = categoria,
MarcaCorrente = marca
};
return View(viewModel);
}
Работает нормально, но только набрав в браузере нужный маршрут. Поэтому я начал писать фильтр, поместив элемент <select>
, который представляет пользователю категории элементов, а затем связал вызов AJAX с его событием change
. Это разметка для представления меню:
@using Magazzino.Domain.Infrastructure
@using Magazzino.Domain.Entities
@model List<Item>
@{ IEnumerable<Item> items = Model.DistinctBy(x => x.Categoria); }
<div class="text-center">Filtra per:</div>
<hr />
<div class="text-center">Categoria</div>
<select class="form-control lista-categorie" id="lista-categorie" data-action-url="@Url.Action("Index", "Home")" name="categoria">
<option value>-- seleziona --</option>
@foreach (Item item in items)
{
<option value="@item.Categoria">@item.Categoria</option>
}
</select>
Это вызов AJAX, помещенный в обычный $ (document) .ready (...):
$('#lista-categorie').on('change', function () {
var e = $(this)[0];
if (e.selectedIndex > 0) {
var ajaxRequest = $.ajax({
url: "/",
type: "get",
data: {
categoria: e.options[e.selectedIndex].value,
marca: null
}
})
ajaxRequest.done(function (response) {
$('#renderbody').html(response);
});
}
});
Я также изменил часть контроллера, где отображается представление:
if (Request.IsAjaxRequest())
{
return PartialView(viewModel);
}
else
{
return View(viewModel);
}
но я получаю только пустую строку. Если попытаться получить полный просмотр , я вижу, что ответ имеет всю страницу (макет и меню) НО Индексный просмотр:
// previous markups from layout and menu
<div id="renderbody" class="col-sm-10">
</div>
</div>
</div>
// other markups
Я уверен, что метод действия Index запущен, потому что я установил точку останова. Хотя в тот момент, когда я меняю сам вызов AJAX таким образом, он работает нормально:
var ajaxRequest = $.ajax({
url: "/" + e.options[e.selectedIndex].value,
type: "get"
})
но мне не нравится этот обходной путь, я хотел бы иметь более простой и эффективный способ передачи данных в контроллер.
Как я могу изменить это поведение?