2013-03-27 32 views
2

我有一個IEnumerable類型的詳細信息視圖。該視圖帶有一堆下拉菜單,可讓您將濾鏡添加到呈現的記錄列表中。使用MVC模型作爲存儲庫中的過濾器

所有這些下拉菜單對應MVC模型屬性:

public class Record 
{ 
    public string CustomerNumber { get; set; } 
    public string CustomerName { get; set; } 
    public string LineOfBusiness{ get; set; } 
    public DateTime? Date { get; set; } 
} 

現在,我用我的模型,我的DTO洗牌我的控制器和我的回購之間的數據。由於我所有的下拉式過濾器都代表模型屬性,因此我將模型傳遞給回購檢索方法,檢查其屬性並根據其值進行過濾?換句話說:

public IEnumerable<TradeSpendRecord> Get(TradeSpendRecord record) 
    { 
     IQueryable<tblTradeSpend> query = _context.tblRecords; 


     if (!String.IsNullOrEmpty(record.CustomerName)) 
      query = query.Where(x => x.CustomerNumber == record.CustomerNumber); 

     if (!String.IsNullOrEmpty(record.LineOfBusiness)) 
      query = query.Where(r => r.LOB == record.LineOfBusiness); 

SNIP

希望這不是太主觀,但我想知道如果任何人有關於這是否是一個好/壞的做法任何輸入。我還沒有看到很多像我需要做的動態過濾的例子,並且正在尋找一些指導。

感謝,

克里斯

+0

這將mvc項目綁定到不理想的dal,我會選擇使用參數或實體項目,其中在dal和mvc項目中使用的實體都保留下來。這些可以形成兩層之間的接口 – Slicksim 2013-03-27 16:27:09

+0

我實際上養成了將我的模型分解爲單獨項目的習慣,正如我所說的,我傾向於將它們用作DTO來在圖層之間移動數據,並在我的MVC中使用ViewModels項目向視圖提供特定數據。 – 2013-03-27 16:31:39

+0

只要它正是你所需要的,這裏沒什麼錯。在你的情況下,你只能查詢一個屬性,而不能查詢它們的組合。如果您想同時搜索客戶名稱和業務線,該怎麼辦?但是你的代碼只會按業務線進行搜索。 – Kath 2013-03-27 18:20:05

回答

0

如果你做你做我想,我不知道這是做的最好的方式。

將您的'模型'保留在您的MVC /表示層(無論這是否是一個物理組合)中,專用於您的表示層。唯一應該觸及它們的是你的Views和你的控制器。你不希望什麼應該是獨立的實體如此緊密地耦合到你的視圖模型。

我建議創建一個單獨的TradeSpendFilter類,它最簡單的就是暴露域實體的可篩選屬性(可能比任何給定的視圖模型都要多)。然後,您會將其傳遞到您的「過濾服務」或任何可能的地方。這也意味着你可以擴展你的過濾功能,不受你的域模型和你的MVC應用程序的影響。例如,如果你突然要篩選多個對象,你可以簡單地改變......

public class TradeSpendFilter 
{ 
    public string CustomerName { get; set; } 
    ... 
} 

...到...

public class TradeSpendFilter 
{ 
    public IEnumerable<string> CustomerNames { get; set; } 
    ... 
} 

...而不會導致各種問題的你的MVC應用程序。

此外,它還意味着您可以在其他地方使用您的過濾功能,而無需將進一步組件綁定到您的MVC應用程序,並最終陷入引導混亂。

+0

我同意,我開始在模型中加入一些對模型沒有意義的東西,而且很明顯我違反了單一責任原則。 – 2013-03-28 16:40:57