2

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

剪辑

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

谢谢,

克里斯

4

1 回答 1

0

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

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

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

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

...到...

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

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

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

于 2013-03-27T18:28:14.577 回答