我有一个输入到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 的
希望这不是太主观,但我想知道是否有人有任何关于这是好/坏做法的意见。我没有看到很多像我需要做的动态过滤的例子,我正在寻找一些指导。
谢谢,
克里斯
答案 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应用程序,最终导致陷入困境。