使用MVC模型作为存储库中的过滤器

时间:2013-03-27 16:21:10

标签: asp.net-mvc asp.net-mvc-3 asp.net-mvc-4

我有一个输入到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

希望这不是太主观,但我想知道是否有人有任何关于这是好/坏做法的意见。我没有看到很多像我需要做的动态过滤的例子,我正在寻找一些指导。

谢谢,

克里斯

1 个答案:

答案 0 :(得分:0)

如果你正在做我认为你正在做的事情,我不确定这是最好的做法。

将“模型”保留在专用于表示层的MVC /表示层(无论是否是一个物理程序集)中。唯一应该触及它们的是你的视图和你的控制器。您不希望独立实体与视图模型紧密耦合。

我建议创建一个单独的TradeSpendFilter类,最简单的是,它暴露了域实体的可过滤属性(可能比任何给定的View模型更多)。然后,您可以将其传递给您的“过滤服务”或任何可能的过滤服务。这也意味着您可以独立于域模型和MVC应用程序扩展过滤功能。例如,如果您突然想要过滤多个对象,则只需更改...

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

...到...

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

...不会导致MVC应用程序出现各种问题。

此外,它还意味着您可以在其他地方使用您的过滤功能,而无需将进一步组件绑定到您的MVC应用程序,最终导致陷入困境。