ASP.NET MVC Фильтрация результатов в списке/сетке

По какой-то причине я застрял на этом. Мне нужно отфильтровать результаты из представления на основе DropDownList в том же представлении. Основная идея заключается в следующем: у меня есть список поставщиков, принадлежащих различным партнерам, но список поставщиков содержит ВСЕ поставщики вместе (для всех партнеров). Мне нужно иметь возможность отображать поставщиков партнером, когда кто-то хочет видеть именно этого партнера (в противном случае список по умолчанию будет ВСЕМИ поставщиками). Мой взгляд в настоящее время является "дефолтом" (показывая все), но по какой-то причине Im сидит здесь, глядя на монитор (последние 2 часа!), Пытаясь понять, как отфильтровать эти результаты.

Любые предложения, с чего начать/как это сделать?

Ответ 1

EDIT: Если вы хотите сделать это с помощью jQuery и AJAX (это обеспечит лучший пользовательский интерфейс, потому что обновится только список подразделений), см. этот учебник.

Если я правильно понимаю, вы в основном хотите сделать обратную передачу в стиле WebForms.

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

Итак, это будет просмотр:

<% using (Html.BeginForm()) { %>
    <%=Html.DropDownList("Address.CountryId", new SelectList(Country.GetAll(), "Id", "Name"), new { onchange = "this.form.submit();" })%>
    <%=Html.DropDownList("Address.CountrySubdivisionId", new SelectList(CountrySubDivision.GetByCountryId(Model.CountryId), "Id", "Name"))%>
    <input type="submit" name="btnSubmit" value="Submit"/>
<%} %>

Это ключ для фильтрации зависимого списка:

new { onchange = "this.form.submit();" }

И в контроллере у вас будет что-то вроде этого:

    [AcceptVerbs(HttpVerbs.Post)]
    public ViewResult Index(string btnSubmit)
    {
        if (btnSubmit == null)
        {
            // return the view displayed upon GET
        }
        else
        {
            // process the submitted data
        }
    }

В приведенном выше коде, если представление формы было вызвано изменением значения в выпадающем списке, btnSubmit будет null. Таким образом, действие, которое вы отправляете POST, может определить, должен ли пользователь завершить ее изменения.

Ответ 2

Чтобы добавить более ранние ответы.

Чтобы создать раскрывающийся список (в ASP.NET MVC 3), я сделал следующее:

Добавить код в Index.cshtml

@using (Html.BeginForm())
{      
@Html.DropDownList("EmployeeId", (SelectList)ViewData["EmployeeId"])     
 <input type="submit" name="btnSubmit" value="Submit"/> 
}

Добавить код в YourModelNameController.cs в ActionResult по умолчанию для Index()

public ActionResult Index()
{

    //create a selectlist
        var employeeList = from el in db.Employee select el;
        ViewData["EmployeeId"] = new SelectList(employeeList, "EmployeeId", "TmName");

        return View(modelName);
    }

Ответ 3

Есть много способов обмануть этого кота. Здесь один.

Закройте свой DropDownList в форме с помощью METHOD = GET.

<form action="" method="get">
  <select name="provider">
    <option>1</option>
    <!-- etc -->
  </select>
</form>

Затем, в вашем контроллере, фильтр основан на значении поставщика, который был передан. Не забудьте рассматривать его как параметр Nullable, чтобы вы могли иметь какое-то поведение, когда оно пусто.

Не публикуя некоторые из ваших текущих кодов, трудно получить гораздо более конкретную информацию.

Ответ 4

Предположим, что вы, вероятно, передаете модель в представление, и эта модель представляет собой список или IEnummerable из партнеров. Вы хотите ограничить список. Чтобы сделать это, добавьте раскрывающийся список в представление и заполните его несколькими возможными партнерами. Это можно сделать либо путем размещения списка в ViewData, либо путем добавления модели обратно в представление. Оба имеют преимущества. Теперь, когда вы меняете выпадающий, перезагрузите страницу, но добавьте параметр, который является фильтром. В контроллере проверьте этот параметр в действии, если он отсутствует, верните нефильтрованный список, если он затем применит фильтр и вернет список. Представление будет просто тупо отображать все, что вы ему даете.

Что касается фильтрации, вы можете попробовать использовать LINQ.

Ответ 5

Вероятно, вам нужен параметр для действия вашего контроллера, возможно, идентификатор (nullable?) поставщика, чтобы отфильтровать результаты, когда вы получаете их из БД. Затем просто используйте один и тот же вид, чтобы перечислить их, и запросите новый список, если выпадающий список изменится.