部分视图或控制器中的Linq查询

时间:2014-06-03 08:01:27

标签: c# asp.net-mvc linq asp.net-mvc-partialview

我想知道您对此的看法: 我在局部视图中有一个linq查询(主页调用@ttml.action(mypartial)从PartialViewResult返回数据)我希望看到最好的方法:请证明你的意见。

1 - 在部分视图中使用linq查询:我们知道在控制器中我们只是更改/操作查询(IENumerable)。渲染视图时会联系数据库

2 - 在控制器中拥有linq查询并传递ViewBags。

3 - 创建一个视图模型,为其指定值,然后将其传递给部分。

这是部分:

 <div class="notification">
            <div class="messages pull-left">
                <div class="count">
                    @ViewBag.TotalMessages
                </div>
            </div>
            <div class="notifications pull-left">
                <div class="count">
                    @Model.jobs.SelectMany(x => x.jobMessages.Where(w => w.owner.Equals(false) && w.seenAt == null)).Count();
                </div>
            </div>
            <div class="credits pull-left">
                <span class="strong">@Model.transactionItems.Sum(x => x.quantity) </span> credits
            </div>
            <div class="creditPurchase pull-left">
                <a href="#">Buy credits</a>
            </div>
        </div>

在控制器中,我有这个:

public PartialViewResult BusinessNotificationPartial()
    {
        if (MySession.Current.Account.accountType == "business")
        {
            int businessId = MySession.Current.Businesses.FirstOrDefault().businessId;
            UnitOfWork uow = new UnitOfWork();
            BusinessRepository busRepo = new BusinessRepository(uow);
            var bus = busRepo.GetById(businessId);


            return PartialView("_BusinessNotificationPartial", bus);
        }
        else
        {
            return null;
        }      
    }

3 个答案:

答案 0 :(得分:0)

始终在controller / viewmodel中。永远不要看。视图的唯一目的是仅显示数据,否则您将在UI中组合数据检索/处理!这就是全部。你的逻辑应该在控制器/业务逻辑层完成,你的数据应该总是在你的DAL层完成。

您的viewmodel应始终包含您要显示/绑定到视图的数据。同样,无论是单个项目还是集合 - 只是某种形式的数据没有强引用EF,因为EF是数据访问/ ORM映射层。

答案 1 :(得分:0)

在我看来(可以不同意顺便说一下);我对自己施加的“规则”如下:

  • 控制器从文件和数据库等来源读取数据。
  • viewmodel拥有所有数据,除了它自己的内部集合之外,它永远不会从任何其他来源读取。但是,如果viewmodel返回以不同方式排序或以其他方式查询的数据,则可以。但同样,只有内存中的集合和它在控制器构造和返回时收到的对象。
  • 该视图仅适用于现成的列表和对象,唯一担心的是视图。也就是说,以某种格式表示数据,通常是html。

这对我来说通常非常有用,而且我发现的例外情况很少。

我的2 ct。

编辑/旁注:我在视图模型中使用EF对象和EF对象列表。有些人不喜欢这样,但是经过许多项目并且从未经历过意外的影响我真的不知道大惊小怪的是什么。它只是一个模型,它描述了你的数据是什么样的,所以为了皮特的缘故,使用EF poco。

编辑2:在您给出的特定示例中,我建议您将自定义视图模型传递给partial,其中包含'bus'对象作为属性。我发现很有可能(比如大约90%)你想要在未来传递一些额外的东西,比如元数据或其他东西。

答案 2 :(得分:0)

始终最好使用视图模型为其分配值并将其传递给部分。数据将从数据源获取并传递到局部视图。并且视图仅用于前端,选项2(设置为查看包)仅在极少数情况下可以建议,在这种情况下,您必须存储非常轻的信息以使用多个位置。