2009-01-12 24 views
1

對於給定的報告,用戶將希望有多個過濾選項。當這些選項是枚舉和其他'靜態'數據類型時,這並不壞,但是當您需要一個由存儲在後端表中的字段填充的選擇列表時,事情會變得很快。你如何處理ASP.NET MVC中的報表過濾器?

你如何處理這種情況?我發現自己經常重塑視圖數據,以適應額外的過濾器領域,但它真的開始有點跟蹤不僅選擇的選項,而且選項本身...

有沒有更好的方法?

回答

1

您可以使用jQuery和JsonResults從MVC應用程序異步獲取屏幕上的數據,這就是我們在應用程序中填充所有列表和搜索的方式。 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

我目前正在爲我們的產品之一在工作中建立一個新的報告部分,並且正在處理同樣的問題。到目前爲止,我提出的解決方案雖然還沒有實施,所以這仍然是一項正在進行的工作,與此一致。

將會有一個類將代表一個報表過濾器,它將包含一些基本信息,如標籤文本和選項值列表。

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; } 
} 

然後我的看法(S)內我還會有一些輔助方法,將採取在這些選項類和打造出來的實際控制我。

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在這裏發佈的數據,並獲得更新的過濾選項。當您縮小搜索條件時,深入分析的工作方式與amazon或newegg中的搜索選項類似。

我希望所有對我來說很有意義身邊的人。如果有人對改進它有一些意見,我很樂意聽到它。

+0

真的很有趣的方法 - 它看起來強大和靈活。你有沒有實現它?有沒有出現非明顯的問題? – Basic 2010-10-21 11:38:42

0

即席報表上的過濾的確特別是當你想顯示自定義用戶界面控件根據數據類型,做驗證,做一些過濾器依賴於彼此和其他人不是等一個棘手的問題

一兩件事,我覺得這是值得考慮的是舊的「建還是購買」的問題在這裏。有專門的工具,有該做的UI爲臨時過濾器與此幫助等作爲通常的嫌疑人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. 
相關問題