Как вы обрабатываете фильтры отчетов в ASP.NET MVC? - PullRequest
1 голос
/ 13 января 2009

Для данного отчета пользователь захочет иметь несколько параметров фильтрации. Это неплохо, когда в качестве опций используются перечисления и другие «статические» типы данных, однако все может стать глупо быстро, когда вам нужен список выбора, который заполняется полями, хранящимися в таблице в серверной части.

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

нет лучшего способа?

Ответы [ 3 ]

2 голосов
/ 05 февраля 2009

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

Будет класс, который будет представлять фильтр отчета, который будет содержать некоторую базовую информацию, такую ​​как текст метки и список значений параметров.

public enum DisplayStyle
{
    DropDown,
    ListBox,
    RadioList,
    CheckList,
    TextBox
}

public class FilterOption
{
    public string Name { get; set; }
    public string Value { get; set; }
    public bool Selected { get; set; }
}

public class ReportFilter
{
    public string Title { get; set; }
    public DisplayStyle Style { get; set; }
    public List<FilterOption> Options { get; set; }
}

И тогда моя модель будет содержать список этих классов опций, которые будут сгенерированы на основе потребностей каждого отчета. У меня также есть базовый класс отчета, от которого унаследуется каждый отчет, чтобы я мог обрабатывать построение списков опций для каждого отчета и использовать одно представление для их обработки.

public class ReportModel
{
    public string Name { get; set; }
    public List<ReportFilter> Filters { get; set; }
    public DateTime StartDate { get; set; }
    public DateTime EndDate { get; set; }
}

Тогда внутри моих представлений у меня будут некоторые вспомогательные методы, которые будут принимать эти классы опций и создавать для меня фактические элементы управления.

public static string ReportFilter(this HtmlHelper htmlHelper, DisplayStyle displayStyle, FilterOption filterOption)
{
    switch (displayStyle)
    {
        case DisplayStyle.TextBox:
            return string.Format("<input type=\"text\"{0}>", filterOption.Selected ? (" value=\"" + filterOption.Value + "\"") : string.Empty);
            break;
        ...
    }
}

Мой маршрут будет выглядеть так

Reports/{reportID}/start/{startDate}/end/{endDate}/{*pathInfo}

Все отчеты имеют дату начала и окончания, а затем дополнительные фильтры. Параметр catchall будет иметь списки значений фильтра в форме «Клиент / 1,4,7 / Программа / 45,783». Так что это будет похоже на пару ключ / значение в форме списка. Затем, когда контроллер загружается, он анализирует эти значения во что-то более значимое.

public static Dictionary<string, string> RouteParams(string pathInfo)
{
    if (string.IsNullOrEmpty(pathInfo))
    {
        return new Dictionary<string, string>();
    }

    var values = new Dictionary<string, string>();

    // split out params and add to the dictionary object

    return values;
}

Затем он передает их классу отчета и проверяет их, чтобы убедиться, что они верны для этого отчета. Затем при загрузке параметров для этого отчета все, что было установлено в URL-адресе, будет установлено в значение «Выбрано» в классе ReportOption, чтобы можно было поддерживать их состояние. Затем список фильтров и другие данные отчета будут добавлены в модель.

Для моей настройки некоторые фильтры изменятся при изменении выбора другого фильтра, поэтому здесь будет некоторое количество AJAX для публикации данных и получения обновленных параметров фильтра. Развертывание будет работать подобно параметрам поиска в amazon или newegg, когда вы сузите критерии поиска.

Я надеюсь, что все это имеет смысл для кого-то, кроме меня. И если у кого-то есть вклад в его улучшение, я буду рад это услышать.

1 голос
/ 13 января 2009

Вы можете отправлять и извлекать данные асинхронно на экране, используя jQuery и JsonResults из вашего приложения MVC, так мы заполняем все наши списки и запросы в наших приложениях. У меня есть пример того, как это делается здесь.

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

Еще один вариант, хотя этот вариант мне не очень нравится, но решение jQuery может вас не устраивать, - это чтобы объект вашей модели для вашего представления содержал все данные вида, поэтому все, что вам нужно сделать, это установить единую модель Объект и все списки загружаются напрямую и строго типизированы. Это упростит представление и внутренний код, потому что будет более ясно, что для этого представления единственное, что вам нужно, - это полная версия этого объекта модели.

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

public class MyViewMode
{
    public int MyProperty { get; set; }
    public string SomeString { get; set; }
    List<string> ComboListA { get; set; }
    List<string> ComboListB { get; set; }
}

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

0 голосов
/ 17 июля 2012

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

Одна вещь, которую я думаю, что стоит рассмотреть, это старая проблема "build vs buy" здесь. Существуют специальные инструменты для специальных отчетов, которые предоставляют пользовательский интерфейс для специальных фильтров, таких как обычные подозреваемые Crystal Reports , Службы отчетов Microsoft или наши продукт Сервер ActiveReports . В ActiveReports Server мы поддерживаем каскадные подсказки (где доступные значения в подсказках зависят друг от друга) и упрощаем изменение подсказок для всех, даже для нетехнических бизнес-пользователей (если они, очевидно, имеют разрешения). Дополнительная информация о с использованием подсказок на сервере ActiveReports находится здесь . ActiveReports Server также представляет собой весь управляемый код .NET и предоставляет элементы управления ASP.NET и веб-службы, которые позволяют интегрировать его в веб-приложения.

Scott Willeke
Product Manager - ActiveReports Server
GrapeCity inc.
...