В моем проекте 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 в модели представления, чтобы применить их к представлению, пока оно не будет удалено. Является ли это плохой практикой или эта фильтрация должна иметь место в представлении, а не на стороне сервера? Каков наилучший способ сделать это?