簡體   English   中英

在存儲庫中使用MVC模型作為過濾器

[英]Using an MVC Model as a filter in the repository

我有一個輸入為IEnumerable的詳細信息視圖。 該視圖帶有許多下拉菜單,可讓您將過濾器添加到呈現的記錄列表中。

所有這些下拉列表與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,以便在控制器和存儲庫之間重新整理數據。 由於我所有的下拉過濾器都代表模型屬性,因此我將模型傳遞給repo檢索方法,檢查其屬性並根據其值進行過濾? 換一種說法:

 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

希望這不是很主觀,但是我想知道是否有人對這是好事還是壞事有任何意見。 我沒有看到很多我需要做的動態過濾示例,並且正在尋找一些指導。

謝謝,

克里斯

如果您正在做我認為正在做的事情,那么我不確定這是否是最好的方法。

將“模型”保留在專用於您的表示層的MVC /表示層中(無論這是不是一個物理裝配)。 唯一應該影響它們的是視圖和控制器。 您不希望將獨立的實體與視圖模型緊密地聯系在一起。

我建議創建一個單獨的TradeSpendFilter類,該類最簡單地公開您域實體的可過濾屬性(可能比給定的任何View模型更多)。 然后,您可以將其傳遞給您的“過濾服務”或任何其他內容。 這也意味着您可以獨立於域模型和MVC應用程序來擴展過濾功能。 例如,如果您突然想要過濾多個對象,則只需更改...

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

...至...

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

...而不會導致您的MVC應用出現各種問題。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM