Проблема с кнопкой для переключения фильтра. MVC - PullRequest
0 голосов
/ 03 июля 2019

Я очень новичок в MVC, и любая помощь будет принята с благодарностью. В настоящее время у меня есть страница, которая отображает таблицу данных. Я хотел бы добавить кнопку, которая при нажатии добавляет на страницу дополнительный фильтр, а при повторном нажатии - очистит фильтр (функция переключения).

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

Кнопка просмотра:

   <td width="15%">
        @if (ViewBag.curStatus == "NotFiltered")
        {
            @Html.ActionLink("Filter", "Index", new
       {
           sortOrder = ViewBag.CurrentSort,
           qryStatus = ""
       }, new { @class = "btn btn-primary btn-xs" })
        }
        else
        {
            @Html.ActionLink("Filter", "Index", new
       {
           sortOrder = ViewBag.CurrentSort,
           qryStatus = "Filtered"
       }, new { @class = "btn btn-default btn-xs" })
        }
    </td>

Контроллер:

 public ActionResult Table(string sortOrder, string currentFilter, string searchString, int? page)
        {
            ViewBag.CurrentSort = sortOrder;
            ViewBag.NameSortParm = String.IsNullOrEmpty(sortOrder) ? 
              "invlocation" : "";
            ViewBag.curStatus = String.IsNullOrEmpty(sortOrder) ? 
              "NotFiltered" : "Filtered";

        var samples = from s in db.Table1
                      select s;

            switch (sortOrder)
            {
                case "NotFiltered":
                   string selectqry = "select * from Table1 where datereceived is null ";
                   selectqry = selectqry + " and submissionid not in (select id from Table2 where status='Done')";
                   break;
                case "Filtered":                   
                   selectqry = selectqry + " and status <> 'Pending'";
                   break;
            }

            List<vFiltered> list = db.Table1.SqlQuery(selectqry).ToList();

            int pageSize = 10;
            int pageNumber = (page ?? 1);
            return View(vFiltered.ToPagedList(pageNumber, pageSize));
        }

1 Ответ

0 голосов
/ 03 июля 2019

Первое, что я хотел бы упомянуть, это то, что ваш MVC-шаблон немного свободен и в контроллере гораздо больше кода, чем я бы выбрал.

MVC Pattern Diagram

Я предпочитаю и IMO лучший подход - перенести логику на бизнес-уровень или в хранилище.

В хранилище / Запрос:

string selectqry = "select * from Table1 where datereceived is null ";

Всегда происходит, поэтому это должно быть за пределами ваших утверждений if / case.

Если вы не используете Entity Framework и хотите создать запрос вручную, тогда вы можете выполнить:

 switch (sortOrder)
        {
            case "NotFiltered":
               selectqry = selectqry + " and submissionid not in (select id from Table2 where status='Done')";
               break;
            case "Filtered":                   
               selectqry = selectqry + " and status <> 'Pending'";
               break;
        }

Или немного чище:

Dictionary<string, string> filters = new Dictionary<string, string>() 
{
    {"NotFiltered",  "and submissionid not in (select id from Table2 where status='Done')"},
    {"Filtered", " and status <> 'Pending'"}
}

и затем:

string selectqry = "select * from Table1 where datereceived is null ";
selectqry += filters[sortOrder];

Хотя, почему фильтр называется порядком сортировки?

Еще лучше, я бы полностью исключил строку sql, настроил dbContext (предполагая Entity Framework) и сделал бы что-то более похожее на это:

 var results = dbContext.Table1;
if (sortOrder == "NotFiltered")
{
    results.where(x => !dbContext.Table2.Select(s => s.Id).Contains(x.Id);
}
else
{
    results.where(x => x.Status != "Pending");
}
return results.ToList();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...