Как отфильтровать записи базы данных на основе статического выпадающего списка в MVC 5 - PullRequest
0 голосов
/ 22 ноября 2018

я хочу отфильтровать запись базы данных на основе столбца базы данных QtyRectained, QtyRectained и Void с использованием статического html dropdwonlist

QtyRectained, QtyRectained является десятичным и void является логическим

вот что я пробовал

@Html.DropDownList("Filter", new List<SelectListItem>

           {
              new SelectListItem{ Text="Open", Value = "0" },
              new SelectListItem{ Text="Partial", Value = "1" },
              new SelectListItem{ Text="All", Value = "2" }
           })

Я использовал AJAX для отправки запроса на контроллер

$("#Filter").change(function () {
    var listval = $("select option:selected").text();
        $.ajax({
            type: "GET",
            url: "@Url.Action("Index", "MaterialRequest")",
            data: { id: listval }
        });
    });

В моем контроллере я поставил еще, если условие для отображения записейя хочу, когда Open выбран, он показывает записи, где QtyRectained == QtyRequested

, когда Partial выбран, он показывает записи, где QtyRectained и Void = True

и

, когда выбрано Все , тогда будут показаны все записи

Пожалуйста, помогите мне сзапросить фильтрацию записей или показать альтернативный способ сделать это

public ActionResult Index(string listval)
        {
            if (listval == "Open")
            {
                ViewBag.Items = db.Query<MaterialDeptItemVw>("Select mt.MaterialRequestId, mt.TDate, d.DepartmentName, it.ItemName, mt.QtyRequested, mt.Comment, mt.RecievedDateTime , u.UnitName from MaterialRequest mt INNER JOIN Department d ON mt.DepartmentId = d.DepartmentId INNER JOIN Items it ON mt.ItemId = it.ItemId INNER JOIN Units u ON it.UnitId = u.UnitId where QtyRecieved = QtyRequested");
            }
            else if (listval == "Partial")
            {
                ViewBag.Items = db.Query<MaterialDeptItemVw>("Select mt.MaterialRequestId, mt.TDate, d.DepartmentName, it.ItemName, mt.QtyRequested, mt.Comment, mt.RecievedDateTime , u.UnitName from MaterialRequest mt INNER JOIN Department d ON mt.DepartmentId = d.DepartmentId INNER JOIN Items it ON mt.ItemId = it.ItemId INNER JOIN Units u ON it.UnitId = u.UnitId where QtyRecieved < QtyRequested and Void = 0");
            }
            else if (listval == "All")
            {
                ViewBag.Items = db.Query<MaterialDeptItemVw>("Select mt.MaterialRequestId, mt.TDate, d.DepartmentName, it.ItemName, mt.QtyRequested, mt.Comment, mt.RecievedDateTime , u.UnitName from MaterialRequest mt INNER JOIN Department d ON mt.DepartmentId = d.DepartmentId INNER JOIN Items it ON mt.ItemId = it.ItemId INNER JOIN Units u ON it.UnitId = u.UnitId");
            }

            return View();
        }

1 Ответ

0 голосов
/ 22 ноября 2018

У вас есть несколько проблем в коде:

1) Метод действия объявлен как public ActionResult Index(string listval), в то время как в обратном вызове AJAX у вас есть параметр data: { id: listval }, следовательно, вызов AJAX никогда не достиг действия контроллера, потому что он вызвалс другим именем параметра.

2) return View() неприменимо при использовании AJAX, необходимо вернуть данные JSON или частичное представление и обновить целевой элемент DOM из результата AJAX.

Следовательно,вы должны изменить имя параметра на точное совпадение с параметром AJAX data и использовать return Json():

public ActionResult Index(string id)
{
    // using DRY principle, just write the same part of the query in a string variable
    // and add another part depending on case value inside switch block below
    string baseQuery = @"Select mt.MaterialRequestId, mt.TDate, 
                         d.DepartmentName, it.ItemName, 
                         mt.QtyRequested, mt.Comment, 
                         mt.RecievedDateTime , u.UnitName from MaterialRequest mt 
                         INNER JOIN Department d ON mt.DepartmentId = d.DepartmentId 
                         INNER JOIN Items it ON mt.ItemId = it.ItemId 
                         INNER JOIN Units u ON it.UnitId = u.UnitId";

    switch (id)
    {
        case "Open":
            baseQuery += " where QtyRecieved = QtyRequested";
            break;

        case "Partial":
            baseQuery += " where QtyRecieved < QtyRequested and Void = 0";
            break;

        case "All":
            break; // not doing anything

        default: goto case "All";
    }

    // create a list of object from query results
    var items = db.Query<MaterialDeptItemVw>(baseQuery).ToList();

    // return JSON data to populate target element
    return Json(items, JsonRequestBehavior.AllowGet);
}

Затем изменить вызов AJAX для обновления целевого элемента DOM на основе возвращаемых данных:

$("#Filter").change(function () {
    var listval = $("select option:selected").text();
    $.ajax({
        type: "GET",
        url: '@Url.Action("Index", "MaterialRequest")',
        data: { id: listval },
        success: function (result) {
           // an example to update target element
           $('#targetElementID').html(result);
        },
        error: function (xhr, status, err) {
           // error handling
        }
    });
});
...