如何在ASP.NET MVC中处理报告过滤器?

时间:2009-01-12 21:07:46

标签: asp.net-mvc reporting

对于给定的报告,用户希望拥有多个过滤选项。当选项是枚举和其他“静态”数据类型时,这也不错,但是当您需要一个由存储在后端表中的字段填充的选择列表时,事情会变得非常快。

你如何处理这种情况?我发现自己不断重塑View数据以容纳额外的过滤器字段,但它确实开始有点跟踪选定的选项,还有选项本身......

有没有更好的方法?

3 个答案:

答案 0 :(得分:2)

我目前正在为我们的某个产品在工作中构建一个新的报告部分,并且正在处理同样的问题。我到目前为止提出的解决方案,虽然尚未实施,所以这仍然是一项正在进行中的工作,与此类似。

将有一个代表报告过滤器的类,它将包含一些基本信息,例如标签文本和选项值列表。

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参数将具有“Customer / 1,4,7 / Program / 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类中设置为Selected,以便可以维护它们的状态。然后,过滤器列表和其他报告数据将添加到模型中。

对于我的设置,当另一个过滤器选择发生变化时,一些过滤器会发生变化,因此这里会有一些AJAX发布数据并获得更新的过滤器选项。当您缩小搜索条件时,下钻将有点像亚马逊或新网的搜索选项。

我希望对我身边的人都有意义。如果有人对改进它有一些意见,我会很高兴听到它。

答案 1 :(得分:1)

您可以使用来自MVC应用程序的jQuery和JsonResults在屏幕上异步检索数据,这就是我们在应用程序中填充所有列表和搜索的方式。 I have an example of how it is done here.

这种方式视图数据是按需加载的,如果他们不使用额外的过滤器,那么他们就不必获取视图数据,如果一个选择与另一个选择相关,那么就可以清楚地知道您需要哪组数据检索。

另一种选择,虽然我不喜欢这个,但是jQuery解决方案可能不适合你,是让你的视图的模型对象包含所有的视图数据,这样你需要做的就是设置单个模型对象和所有列表都直接加载并强类型化。这将简化视图和后端代码,因为更清楚的是,对于此视图,您唯一需要的是此模型对象的完整版本。

例如,如果您有两个组合框列表,那么您的模型可能如下所示:

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

希望这是有道理的,如果没有请评论,我会扩展它。

答案 2 :(得分:0)

对报告进行特别过滤确实是一个棘手的问题,尤其是当您想要根据数据类型显示自定义用户界面控件,进行验证,使某些过滤器彼此依赖而其他过滤器不依赖,等等时。 / p>

我认为值得考虑的一件事就是旧的“构建与购买”问题。有专门的工具可用于临时报告,它可以为临时过滤器提供帮助,例如常见的嫌疑人Crystal ReportsMicrosoft's Reporting Services或我们的产品ActiveReports Server。在ActiveReports Server中,我们支持级联提示(提示中的可用值相互依赖),并使任何人,甚至非技术业务用户都可以轻松修改提示(假设他们显然具有权限)。有关using prompts in ActiveReports Server is here的更多信息。 ActiveReports Server也是所有托管的.NET代码,并提供ASP.NET控件和Web服务,允许您将其集成到Web应用程序中。

Scott Willeke
Product Manager - ActiveReports Server
GrapeCity inc.