如何处理ASP.NET MVC 3中的复杂查询?

时间:2011-01-28 20:29:11

标签: c# asp.net-mvc asp.net-mvc-3

虽然我在这个问题中要详细说明的问题非常具体,但我想它应该可以帮助像我这样的其他初学程序员。我有以下情况:在我正在设计的系统中,用户可以选择在数据库中设置搜索的值(而不是仅仅将控制器操作的参数路由到数据库中对象的id,正如我之前所做的那样),包含以下字段:

  • 发电厂(所有现有发电厂的下拉列表)
  • 生成单位(具有多个选择的列表框,显示所选发电厂的生成单位)
  • 期间(可用时间跨度的下拉列表,如“过去7天”和“上个月”)
  • 开始和结束时间(如果不是选择预定义的时间,用户想要定义特定的时间跨度)

如何将这些元素放在页面上并在数据库中搜索指定的值?我的意思是,如何将此字段设置为可以发送到POST操作的对象,以便它可以与数据库进行比较并获取值?我试图做的包括为此创建一个编辑器模板(但我无法理解我在做什么),并且我尝试创建一个控制器来处理这些查询,所以我可以在另一个中呈现查询页面(但我最终得到了一个页面内的页面,最好是“yo dawg I haerd u liek”风格)。

你们能给我一些帮助,所以我不必放弃成为一名程序员并成为说唱歌手吗?

2 个答案:

答案 0 :(得分:1)

这是一个很好的例子:

http://weblogs.asp.net/rajbk/archive/2010/05/08/asp-net-mvc-paging-sorting-filtering-using-the-mvccontrib-grid-and-pager.aspx

我认为它是用MVC 2编写的,但很容易转换为3。

答案 1 :(得分:0)

我不太明白你的问题在你的视图中过滤了什么实体,所以我只称它为“实体”。 在您的控制器中,您应该有一个实体存储库(如果您对存储库模式不熟悉,您应该查找它) 如果你有这个设置,过滤不应该太困难:

创建一个视图模型类,如下所示:

public class EntityFilterViewModel()
{
    string PowerPlanet {get;set;}
    string GeneratingUnits {get;set;}
    string Period{get;set;} // Simplification, you should use timespan or something.
    DateTime BeginTime {get;set;}
    DateTime EndTime {get;set;}
}

接下来,有一个像这样的控制器方法:

public ActionResult Filter(EntityFilterViewModel model) 
{
     var result = from e in _entityRepository.Entites
                  where e.PowerPlanet.Equals(model.PowerPlanet) &&
                        e.GeneratingUnits.Equals(model.GeneratingUnits) &&
                        e.Periond.Equals(model.Period)
                        // other filters you would want...

     return View("List", result); // use the overload which takes a view name and a viewmodel object
}

您应该记住,但要考虑用户未填写过滤表单中所有字段的情况