пустой ответ от jquery ajax через метод действия MVC - PullRequest
0 голосов
/ 06 марта 2019

У меня есть приложение инвентаризации в макете, подобном этому:

<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"
        })

но мне не нравится этот обходной путь, я хотел бы иметь более простой и эффективный способ передачи данных в контроллер.

Как я могу изменить это поведение?

Ответы [ 2 ]

1 голос
/ 06 марта 2019

ПОЛНОСТЬЮ мой плохой: я отредактировал вопрос, потому что когда я сказал: «Я уверен, что ViewModel заполнен», это было правдой.Я только проверил, что метод действия был запущен.

Я сейчас проверил ViewModel и обнаружил проблему: я не учел, что «нулевое» значение, отправленное вызовом AJAX, на самом деле не null, но пустая строка .Я соответственно изменил выражение LINQ, и оно работает

InventarioViewModel viewModel = new InventarioViewModel
{
    Inventario = repository.GetInventario()
        .Where(i => (string.IsNullOrEmpty(categoria) || i.Item.Categoria == categoria) 
                 && (string.IsNullOrEmpty(marca) || 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
};

Несмотря на то, что это тривиальная ошибка (и невероятно смущающий момент), я хотел бы ответить на свой вопрос и оставить его для тех, кто может столкнуться ста же проблема.

ура.

0 голосов
/ 06 марта 2019
$('#lista-categorie').on('change',method_attached_to_event);

function method_attached_to_event(){

  var e = $(this)[0];
  if (e.selectedIndex > 0) {

    var url = '/';
    var obj = {};
    obj.categoria= e.options[e.selectedIndex].value;

    $.ajax({
      url:url,
      method:'POST',
      data:obj,
      success:success,
      error:error
    }); 

  }else{
    // Do something else
  }
}

function success(data,status,jqxhr){
   console.log(data);
}

function error( jqxhr, status, error ){
   console.log(status);
   console.log(error);
   console.log(jqxhr);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...