【问题标题】:Using an MVC Model as a filter in the repository使用 MVC 模型作为存储库中的过滤器
【发布时间】:2013-03-27 16:21:10
【问题描述】:

我有一个输入到 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 之间打乱数据。由于我所有的下拉过滤器都代表模型属性,因此我将模型传递给 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);

剪辑

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

谢谢,

克里斯

【问题讨论】:

  • 这将 mvc 项目与不理想的 dal 联系在一起,我会选择使用参数或实体项目,其中保留了 dal 和 mvc 项目中使用的实体。这些可以形成两层之间的接口
  • 我实际上养成了将我的模型分解为一个单独项目的习惯,正如我所说,我倾向于将它们用作 DTO 在层之间移动数据,并在我的 MVC 项目中使用 ViewModels向视图提供特定数据。
  • 只要它正是您需要的,就没有问题。在您的情况下,您只能通过一个属性进行查询,而不是通过它们的组合进行查询。如果您想同时按客户名称和业务范围进行搜索怎么办?但您的代码将仅按业务线进行搜索。
  • @Kate 这并非完全正确。提供的代码应用了一种“瀑布”技术,通过一个接一个地应用过滤器来缩减结果集。
  • @AntP 是的,但前提是您在查询更改之间进行搜索。但我看不到它们之间的任何代码。

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


【解决方案1】:

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

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

我建议创建一个单独的TradeSpendFilter 类,它最简单地公开您的域实体的可过滤属性(可能比任何给定的视图模型更多)。然后,您会将其传递给您的“过滤服务”或任何可能的内容。这也意味着您可以独立于域模型和 MVC 应用程序扩展过滤功能。比如你突然要过滤多个对象,你可以简单地改变...

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

...到...

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

...不会给您的 MVC 应用程序带来各种问题。

此外,这还意味着您可以在其他地方使用您的过滤功能,而无需将进一步组件绑定到您的 MVC 应用程序并最终陷入自举的混乱。

【讨论】:

  • 我同意,我开始在模型中添加一些对模型来说没有意义的东西,很明显我违反了单一责任原则。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-31
  • 1970-01-01
  • 2011-04-19
  • 1970-01-01
相关资源
最近更新 更多