如何构造控制器来排序多个标准asp.net mvc

设置控制器以按许多(可能为空)标准排序的最佳方法是什么? 比方说,我正在建造一个销售汽车的网站。 我的CarController有一个函数Index(),它返回一个汽车的IList到视图,每个汽车的细节都用局部视图渲染。

构建这个的最佳方法是什么? 特别是如果有很多标准:汽车类型(又名SUV),汽车品牌,汽车模型,汽车年份,汽车价格,汽车颜色,布尔IsNew,或者如果我想最接近我等排序…我’我使用NHibernate作为我的ORM。 我应该只有大量可能的NHibernate查询,并根据控制器中的if / then来确定选择哪一个? 或者有一种更简单的方法。

非常感谢帮忙。

我在我的系统中有任务并创建了用于搜索的特殊类:

public class TaskSearchCriteria { public List Statuses { get; set; } public List Severities { get; set; } public List CreatedBy { get; set; } public List ClosedBy { get; set; } public List LastModificationBy { get; set; } public DateTime? CreationDateFrom { get; set; } public DateTime? CreationDateTo { get; set; } public bool SearchInComments { get; set; } public bool SearchInContent { get; set; } public bool SearchInTitle { get; set; } } 

该类中的一种方法应用filter:

 public IQueryable Filter(IQueryable tasks) { return FilterDates( FilterAssignedTo( FilterGroups( FilterOperationSystems( FilterPlatforms( FilterPriorities( FilterSeverities( FilterVersionsResolved( FilterVersionsReported( FilterTaskContent( FilterStatuses(tasks))))))))))); } 

这是用于过滤的方法之一:

 private IQueryable FilterSeverities(IQueryable tasks) { if (Severities.Contains(TaskSearchConsts.All) || (!Severities.Any())) return tasks; var expressions = new List(); if (Severities.Contains(TaskSearchConsts.Active)) expressions.Add(_taskParameter.EqualExpression("Severity.IsActive", 1)); return tasks.WhereIn(_taskParameter, "Severity.ID", Severities, expressions); } 

这是entity framework,但通过在IQuery中添加where子句,也可以在nHibernate中轻松完成。

要搜索我在控制器中有一个方法:

 [HttpPost] public ActionResult TaskSearch([Bind(Prefix = "Search")]TaskSearchCriteria criteria) 

有一个类用于过滤是很好的,因为它可以被序列化并保存到数据库以供将来使用。 这样用户可以重用filter参数。

你将会拥有:

 public class CarSearchCriteria { List ListOfCarTypesIds; List ListOfCarBrandIds; bool IsNew; //and more } 

如果list为空,则不应用filter。

如果你有很多标准,我发现最好封装在一个类中,而不是传递大量的动作参数。 例如,我正在处理的项目有一个具有以下签名的操作:

 public claass JobsController : Controller { public IList Index(JobSearchCriteria criteria) { IList jobs = _jobs.Find(criteria); //... } } 

存储库方法只是逐步完成构建IQueryable的标准。 此特定项目使用Linq To Sql,但使用NHibernates Criteria API(或Linq to NH)可以应用相同的主体。