Asp. NET Как отфильтровать таблицу с несколькими одновременными фильтрами, отфильтровать ее во внутреннем или внешнем интерфейсе? - PullRequest
0 голосов
/ 30 апреля 2020

В моем проекте ASP. NET MVC у меня есть таблица в представлении с записями из базы данных, такая как:

<div class="myWrapperClass">

            <div class="tableContainer">
                <table class="myTableClass" id="tblOpenTickets">
                    <thead>
                        <tr>
                            <th width="10%">Date</th>
                            <th width="5%">ID</th>
                            <th width="5%">Priority</th>
                            <th width="10%">Reporter</th>
                            <th width="20%">Details</th>
                            <th width="15%">Category</th>
                            <th width="15%">Tags</th>
                            <th width="20%">Assigned</th>       
                            <th>Status</th>
                        </tr>
                    </thead>

                    <tbody>
                        @foreach (Ticket tm in Model.Tickets)
                        {
                            <tr class="tableRows">
                                <td data-info="Date" class="dateCell">@(tm.CreateDate.HasValue ? tm.CreateDate.Value.ToString("dd-MMM-yyyy") : "-")</td>
                                <td data-info="ID" class="idsCell">@tm.ID</td>
                                <td data-info="Priority" class="prioriyCell">
                                    <div class="priorityContainer">
                                        <span class="prioritySpan">@(!string.IsNullOrEmpty(tm.Priority) ? tm.Priority : "-")</span>
                                    </div>
                                </td>
                                <td data-info="Reporter">@(!string.IsNullOrEmpty(tm.Reporter) ? tm.Reporter : "-")</td>

                                <td data-info="Details" class="detailsCell">
                                    <div class="detailsContainer">
                                        <span class="subjectSpan">@(!string.IsNullOrEmpty(tm.Subject) ? tm.Subject : "-")</span>
                                        <span class="descSpan">@(!string.IsNullOrEmpty(tm.Description) ? tm.Description : "-")</span>
                                    </div>
                                </td>

                                @{
                                    var categoryName = Model.TicketCategories.Where(x => x.ID == tm.CategoryID).Select(x => x.Name).FirstOrDefault();
                                    <td data-info="Category" class="categoryCell">@(string.IsNullOrEmpty(categoryName) ? "-" : categoryName)</td>
                                }
                                <td data-info="Tags" class="tagsCell">@(!string.IsNullOrEmpty(tm.Tags) ? tm.Tags : "-")</td>
                                <td data-info="Assigned" class="assignedCell">@(!string.IsNullOrEmpty(tm.AssignedAdminsStr) ? tm.AssignedAdminsStr : "Unassigned")</td>
                                <td data-info="Status" class="statusCell">@(!string.IsNullOrEmpty(tm.Status) ? tm.Status : "-")</td>
                            </tr>
                        }
                    </tbody>
                </table>
            </div>

            <div class="cover-bar"></div>
        </div>

На той же странице у меня есть модал, который всплывающие окна с фильтрами для применения, то есть форма, затем я отправляю форму с фильтрами и в контроллере:

{ 
// ...... 
ChatVM chatVM = new ChatVM();

var openTixFilters = Request["hasSubmittedOpenTixFilters"];
            var closedTixFilters = Request["hasSubmittedClosedTixFilters"];
            chatVM.HasOpenTixFilters = !string.IsNullOrEmpty(openTixFilters) && (openTixFilters == "true");
            chatVM.HasClosedTixFilters = !string.IsNullOrEmpty(closedTixFilters) && (closedTixFilters == "true");

            if (chatVM.HasOpenTixFilters || chatVM.HasClosedTixFilters)
            {
                IEnumerable<Ticket> filteredList = Enumerable.Empty<Ticket>();
                filteredList = chatVM.HasOpenTixFilters ? chatVM.AllOpenTickets : chatVM.AllClosedTickets;

                string dateStart = Request["startDate"];
                string dateEnd = Request["endDate"];
                string priority = Request["filterPriority"];
                string reporter = Request["filterReporter"];
                string category = Request["filterCategory"];
                string assigned = Request["filterAssigned"];
                string tags = Request["filterTags"];
                string status = Request["filterStatus"];
                string campus = Request["filterCampus"];

                if (!string.IsNullOrEmpty(dateStart) && !string.IsNullOrEmpty(dateEnd))
                {
                    if (DateTime.TryParse(dateStart, out DateTime startDate) && DateTime.TryParse(dateEnd, out DateTime endDate))
                    {
                        chatVM.HasRangeFilterApplied = true;

                        if (filteredList != null && filteredList.Count() > 0)
                            filteredList = filteredList.Where(x => x.CreateDate >= startDate && x.CreateDate <= endDate).Select(x => x);
                    }                  
                }

                if (!string.IsNullOrEmpty(priority))
                {
                    chatVM.HasPriorityFilterApplied = true;
                    filteredList = filteredList.Where(x => (x.Priority != null) && (x.Priority.ToLower() == priority.ToLower())).Select(x => x);
                }

                if (!string.IsNullOrEmpty(reporter))
                {
                    // To do
                }

                chatVM.TableTickets = filteredList;
            }

            return View(chatVM);
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...