【问题标题】:MVC dealing with multiple LINQ Queries in a single ViewMVC 在单个视图中处理多个 LINQ 查询
【发布时间】:2011-10-26 18:09:06
【问题描述】:

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

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

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

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


模型和控制器将如何实现这一目标? 一些简单的代码示例会很有帮助:)

【问题讨论】:

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


    【解决方案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);
        }
    }
    

    【讨论】:

    • 谢谢你们!真的很有帮助,是的,我已经告诉过几次了,有时我只是在控制器中创建查询时无法重用它们,这让我很恼火!
    【解决方案2】:

    哇,将 LinqDataContext 填充到 View 闻起来很糟糕。你为什么要这么做?

    控制器应该从所述 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);
    }
    

    【讨论】:

    • 谢谢你的精彩,会仔细看看!我还要如何从一个视图循环遍历两个表?我可以做 [[ViewData["linq"] = from c in d... ]] 但这不会给我智慧
    • 如果我在哪里不使用 lambda 表达式会怎样?我还不知道它们是如何工作的,所以我宁愿使用我所知道的用户!
    • @user scottm 基本上有一个不使用 lambda 的解决方案。
    【解决方案3】:

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

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

    在控制器中

    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();
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-02-08
      • 1970-01-01
      • 1970-01-01
      • 2017-02-08
      • 2015-01-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多