MVC在单个视图中处理多个LINQ查询

时间:2011-10-26 18:09:06

标签: c# asp.net-mvc linq linq-to-sql

现在,我意识到这个问题之前已经得到了回答,但是我无法绕过它并让它在我的例子中发挥作用:

查看
   应该包含2个foreach循环fx
   foreach(Model.ListA中的var项)
   foreach(Model.ListB中的var项目)

模型
应该包含一个带有LinqDataContext对象的类和两个属性:(ListA和ListB)

控制器
应该通过视图传递模型。


模型和控制器如何实现这一目标? 一些简单的代码示例会非常有用:)

3 个答案:

答案 0 :(得分:1)

你有点落后了。您的数据上下文应该在控制器中(最好在控制器使用的层中)。您总是希望控制器负责获取/更新数据,并填充模型。然后,模型将传递给视图,其中包含显示该数据所需的所有内容。

public class MyModel
{
    public List<ListAEntity> ListA {get;set;}
    public List<ListBEntity> ListB {get;set;}
}


public class HomeController : Controller
{
    private readonly MyDataContext _context = new MyDataContext();

    public ActionResult Index()
    {
        var model = new MyModel()
        {
            ListA = _context.Get<ListAEntity>().ToList(),
            ListB = _context.Get<ListBEntity>().ToList()
        };

        return View(model);
    }
}

答案 1 :(得分:1)

哇,将一个LinqDataContext填充到一个视图味道很糟糕。你为什么这样做?

控制器应从所述LinqDataContext或后端服务获取所需的所有数据,然后创建一个仅包含IList或IEnumerable的简单ViewModel。

public class YourViewModel 
{
    public List<A> ListA {get; set;}
    public List<B> ListB {get; set;}
}

public ActionResult YourControllerAction()
{
   var context = yourDataContext;

   var model = new YourViewModel
   {
      ListA = context.TableA.Where(x => x.Something)
                     .Select(x => x.ConvertSqlToBusinessObject()).ToList(),
      ListB = context.TableB.Where(x => x.Something)
                     .Select(x => x.ConvertSqlToBusinessObject()).ToList()
   };

   return View("Index",model);
}

答案 2 :(得分:0)

我会在之前的答案中添加一些小的补充:控制器应该实现选择正确的视图和视图模型所需的逻辑,但它不应该填充视图模型。视图模型完全能够填充自己。

此模式改进了控制器和视图模型的封装,并在关注点之间创建了更清晰的分界。因此,如果我窃取迈克尔的代码片段:

在控制器中

public ActionResult YourControllerAction(){
   MyDbContext context = new MyDbContext();
   return View("YourControllerAction", new YourViewModel(context));
}

在视图模型中

public class YourControllerAction {
    public YourControllerAction(MyDbContext context) {
         ListA = context.TableA.Where(x => x.Something).Select(x => x.ConvertSqlToBusinessObject()).ToList();
         ListB = context.TableB.Where(x => x.Something).Select(x => x.ConvertSqlToBusinessObject()).ToList();
    }
}