Отображение динамических данных из запроса AJAX на контроллер в табличном представлении ASP.NET MVC - PullRequest
0 голосов
/ 06 июня 2019

Я пытаюсь передать данные, возвращенные из Controller с помощью вызова AJAX, в мою таблицу в представлении, где они запрашиваются (с фильтрами). Чтобы быть более точным, есть 3 фильтра: дата и время, сотрудник и посетитель. В зависимости от выбранной комбинации, Controller возвращает отфильтрованные данные из базы данных.

Когда загружено представление, оно показывает всех посетителей в базе данных, которые имеют значение в поле Departure. Я хочу, чтобы после применения фильтров отображались отфильтрованные посетители.

Archive.cshtml

@model IEnumerable<Visitor_Management.Models.Visitor>

@{
    ViewBag.Title = "Archive";
}

<div>
    <h2>"Archive"</h2>
    <div>&nbsp;</div>
</div>
<form class="form-inline" id="formFilters" runat="server">
    <div>
        <label style="margin-left:10px;">Date and time:</label>
        <input type="text" name="picker" id="picker" class="form-control" size="30" />
        <label style="margin-left:10px;">Employee:</label>
        <input type="text" id="employee" class="form-control" placeholder="select an employee" />
        <label style="margin-left:10px;">Visitor:</label>
        <input type="text" id="visitor" placeholder="select a visitor" class="form-control" style="margin-right:20px;" />
        <button type="submit" class="btn navbar-btn btn-primary " name="filter" id="filter" value="filter">Filter</button>
    </div>

    <div>&nbsp;</div>
</form>
<table class="table table-bordered table-condensed table-striped text-center" id="archiveTable">

    <tr>

        <th class="text-center">
            @Html.DisplayNameFor(model => model.ID)
        </th>

        <th class="text-center">
            @Html.DisplayNameFor(model => model.Date)
        </th>

        <th class="text-center">
            @Html.DisplayNameFor(model => model.Arrival)
        </th>

        <th class="text-center">
            @Html.DisplayNameFor(model => model.Departure)
        </th>

        <th class="text-center">
            @Html.DisplayNameFor(model => model.Name)
        </th>
        <th class="text-center">
            @Html.DisplayNameFor(model => model.Surname)
        </th>
        <th class="text-center">
            @Html.DisplayNameFor(model => model.Employee)
        </th>
        <th class="text-center">
            ID Card
        </th>
        <th class="text-center">
            Pass ID
        </th>

    </tr>

    @foreach (var item in Model)
    {
     var Date = item.Datum.ToShortDateString();
     <tr>
        <td>
            @Html.DisplayFor(modelItem => item.ID)
        </td>
        <td>
            @Html.DisplayFor(modelItem => Date)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.Arrival)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.Departure)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.Name)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.Surname)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.Employee)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.CardID)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.PassID)
        </td>

     </tr>

     }

</table>

AJAX call

<script>
    $('#filter').click(function () {
        $.ajax({
            url: "Filter",
            data: {
                'datepicker': $('#picker').val().toString(),
                'employee': $('#employee').val().toString(),
                'visitor' : $('#visitor').val().toString()
            },
            async: false,
            dataType: "json",
            contentType: "application/json;charset=utf-8",
            type: "POST", 
            success: function (result) {
                alert("Works");
                $('#archiveTable').html(result)
            },
            error: function (result) {
                alert("Error")
            }
        }); 
    });  
</script>

VisitorsController.cs

public ActionResult Filter(string datepicker,string employee,string visitor)
        {
         List<Visitor> filterList = new List<Visitor>();

            //filter data to get an filtered list

            return View("Archive",filterList);
        }

Он говорит, что "работает" из части AJAX с предупреждением об успешном завершении, но я не получаю никаких новых (отфильтрованных) данных в таблице, как будто ничего не произошло, и представление просто перезагружается (обновляется).

Если я верну тип JSON с ActionResult, равным JsonResult, я смогу прочитать данные, и отфильтрованные данные верны и верны, но я все еще не могу загрузить эти данные в мою таблицу.

1 Ответ

1 голос
/ 06 июня 2019

Попробуйте вывести вашу таблицу в частичное представление (назовем ее _ResultTable и поместим вашу таблицу в div с идентификатором resultTable в вашем представлении):

@model IEnumerable<Visitor_Management.Models.Visitor>

@{
    ViewBag.Title = "Archive";
}

<div>
    <h2>"Archive"</h2>
    <div>&nbsp;</div>
</div>
<form class="form-inline" id="formFilters" runat="server">
    <div>
        <label style="margin-left:10px;">Date and time:</label>
        <input type="text" name="picker" id="picker" class="form-control" size="30" />
        <label style="margin-left:10px;">Employee:</label>
        <input type="text" id="employee" class="form-control" placeholder="select an employee" />
        <label style="margin-left:10px;">Visitor:</label>
        <input type="text" id="visitor" placeholder="select a visitor" class="form-control" style="margin-right:20px;" />
        <button type="submit" class="btn navbar-btn btn-primary " name="filter" id="filter" value="filter">Filter</button>
    </div>

    <div>&nbsp;</div>
</form>
<div id="resultTable">
     @Html.Partial("_ResultTable", Model)
</div>

Частичное представление:

@model IEnumerable<Visitor_Management.Models.Visitor>
<table class="table table-bordered table-condensed table-striped text-center" id="archiveTable">

        <tr>

            <th class="text-center">
                @Html.DisplayNameFor(model => model.ID)
            </th>

            <th class="text-center">
                @Html.DisplayNameFor(model => model.Date)
            </th>

            <th class="text-center">
                @Html.DisplayNameFor(model => model.Arrival)
            </th>

            <th class="text-center">
                @Html.DisplayNameFor(model => model.Departure)
            </th>

            <th class="text-center">
                @Html.DisplayNameFor(model => model.Name)
            </th>
            <th class="text-center">
                @Html.DisplayNameFor(model => model.Surname)
            </th>
            <th class="text-center">
                @Html.DisplayNameFor(model => model.Employee)
            </th>
            <th class="text-center">
                ID Card
            </th>
            <th class="text-center">
                Pass ID
            </th>

        </tr>

        @foreach (var item in Model)
        {
         var Date = item.Datum.ToShortDateString();
         <tr>
            <td>
                @Html.DisplayFor(modelItem => item.ID)
            </td>
            <td>
                @Html.DisplayFor(modelItem => Date)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.Arrival)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.Departure)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.Name)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.Surname)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.Employee)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.CardID)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.PassID)
            </td>

         </tr>

         }

    </table>

и затем верните его из действия вашего контроллера:

public ActionResult Filter(string datepicker,string employee,string visitor)
{
    List<Visitor> filterList = new List<Visitor>();

     //filter data to get an filtered list

     return PartialView("_ResultTable",filterList);
 }

В своем посте ajax просто установите html вашего div в результат действия.Кроме того, вам нужно добавить кнопку submit для отправки по умолчанию, чтобы она не отправляла вашу форму дважды.

<script>
    $('#filter').click(function (e) {
        e.preventDefault();
        $.ajax({
            url: "Filter",
            data: {
                'datepicker': $('#picker').val().toString(),
                'employee': $('#employee').val().toString(),
                'visitor' : $('#visitor').val().toString()
            },
            async: false,
            dataType: "json",
            contentType: "application/json;charset=utf-8",
            type: "POST", 
            success: function (result) {
                alert("Works");
                $('#resultTable').html(result)
            },
            error: function (result) {
                alert("Error")
            }
        }); 
    });  
</script>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...