Asp.net mvc 我们是否可以在asp net mvc视图中直接执行LINQ

Asp.net mvc 我们是否可以在asp net mvc视图中直接执行LINQ,asp.net-mvc,linq,Asp.net Mvc,Linq,通过查看我们正在进行的项目(ASP MVC 3.0),我在我的一个ASPX视图中看到了这部分代码: var groups = Model.GroupBy(t => new { t.OrganizationUnitName, t.OrganizationUnitId, t.ServiceTermDate }).OrderBy(m =>m.Key.ServiceTermDate).ThenBy(m => m.Key. OrganizationUnitId); foreach

通过查看我们正在进行的项目(ASP MVC 3.0),我在我的一个ASPX视图中看到了这部分代码:

var groups = Model.GroupBy(t => new { t.OrganizationUnitName, t.OrganizationUnitId,   t.ServiceTermDate }).OrderBy(m =>m.Key.ServiceTermDate).ThenBy(m => m.Key. OrganizationUnitId);
  foreach (var group in groups){
             var data = group.Select(t => new 
                                   {
                                       t.PersonFullName, 
                                       t.ServiceTermStatusName,
                                       t.VisitTypeName,
                                       SubType = ControllerHelper.LocalizedPersonSubType(t.PersonSubTypeName),
                                       t.MedicalServiceName,
                                       t.PersonId,
                                       t.ServiceTermId,
                                       t.Phone,
                                       CountryName = t.Name,
                                       PersonUniqueNumber = t.GetUniqueIdentifyingNumber(),

                                   }).OrderBy(m => m.HoursFromMinutesFrom);

foreach(var item in data){%>
...............
//render table and table rows, for sample
    <tr>
        <td><%= item.PersonFullName%></td>
    </tr>
..............  
<%}%>
<%}%>               




<%}%>
var groups=Model.GroupBy(t=>new{t.OrganizationUnitName,t.OrganizationUnitId,t.ServiceTermDate}).OrderBy(m=>m.Key.ServiceTermDate).然后by(m=>m.Key.OrganizationUnitId);
foreach(组中的var组){
var data=group.Select(t=>new
{
t、 人名,
t、 ServiceTermStatusName,
t、 VisitTypeName,
SubType=ControllerHelper.LocalizedPersonSubType(t.PersonSubTypeName),
t、 医疗服务名称,
t、 人格,
t、 ServiceTermId,
t、 电话,
CountryName=t.Name,
PersonUniqueNumber=t.GetUniqueIdentificationNumber(),
}).OrderBy(m=>m.HoursFromMinutesFrom);
foreach(数据中的变量项){%>
...............
//渲染表和表行,用于示例
..............  
我不确定这是否是最佳编码实践,LINQ语句是否应该直接放在controller helper(或其他地方)的视图中?如果我是对的,如何利用最佳编码实践来实现这一点

先谢谢你


似乎直接在视图中执行的LINQ不仅位于错误的位置,而且还提出了另一个有趣的问题:如果我们将其放置在服务层或控制器或控制器帮助器中,那么在这种情况下它将如何传递-匿名类型I分组到强类型视图?

就我个人而言,我不会使用在视图中执行LINQ。在控制器中执行此操作以进行单元测试

如果要执行逻辑,在一个更大的应用程序中,我甚至会将它移到一个包含所有LINQ查询的服务程序集中


您的视图应尽可能基本。任何排序、分组或排序都应在您的控制器中完成(最好借助于可在整个应用程序中重复使用的帮助器方法)。

ASP.NET MVC(以及我通常所说的MVC范型)的原理是:

  • 在视图中放入尽可能少的代码 模型类中的引用数据,可能带有一些循环或 条件语句

  • 不要将复杂的应用程序逻辑放入控制器方法中。 理想情况下,这些方法应该只从用户那里收集输入数据 (如果有),执行所有适当的安全性和数据验证,然后将数据传递给应用程序逻辑(或业务逻辑) 类,然后重定向到具有新模型数据的适当视图 从logic类获得。(我曾经读到控制器方法的代码不应超过10行;也许这有点夸张,但你明白了)

所以我想说:不仅视图应该是无LINQ的;控制器也应该是这样的

是的,您可以在视图中执行操作,但我更喜欢使用通过 控制器,而不是在视图中

视图仅用于显示GUI,GUI必须是基本的和简单的,以降低GUI的复杂性


为了使应用程序代码具有一致性、可维护性和可重用性,将这些类型的逻辑放在业务逻辑类上,而不是在控制器或视图上编写。

MVC是关于关注点的抽象

您在上面发布的代码违反了MVC最重要的规则。视图就是视图,它没有业务逻辑或数据访问代码。它只是以一种很好的方式显示提供给它的数据,允许演示和用户交互。可以将视图视为您可以提供给对asp.net一无所知的设计师的东西

上面的问题是ViewModel的完美候选者。“模型”此处使用的变量是错误的,因为您正在获取该变量,然后将其更改为显示不同的内容。如果域模型不适合,则控制器应创建一个与视图预期完全相同的ViewModel。有几种方法可以实现此目的。但有一种方法是:

public ActionResult DoSomething()
{
    List<DomainModel> modelCollection = getListOfDomainModels();
    // Perform ViewModel projection
    var viewModelList = modelCollection
       .GroupBy(t => new { t.OrganizationUnitName, t.OrganizationUnitId,   t.ServiceTermDate })
       .OrderBy(m =>m.Key.ServiceTermDate)
       .ThenBy(m => m.Key. OrganizationUnitId)
       .Select(p => new MyViewModel()
        {
             FullName = t.PersonFullName, 
             StatusName = t.ServiceTermStatusName,
             // etc ...
        });
    return View("DoSomethingView", viewModelList);
}
public ActionResult DoSomething()
{
List modelCollection=getListOfDomainModels();
//执行ViewModel投影
var viewModelList=modelCollection
.GroupBy(t=>new{t.OrganizationUnitName,t.OrganizationUnitId,t.ServiceTermDate})
.OrderBy(m=>m.Key.ServiceTermDate)
.ThenBy(m=>m.Key.OrganizationUnitId)
.Select(p=>newmyviewmodel()
{
FullName=t.PersonFullName,
StatusName=t.ServiceTermStatusName,
//等等。。。
});
返回视图(“DoSomethingView”,viewModelList);
}
现在,模型变量将包含视图的正确模型


根据项目的大小和要求,您可以在控制器外的另一层执行整个查询,然后投影到控制器内的ViewModel,从而使这项工作做得更好。

您不应该在视图或控制器中进行此项工作。因此,如果一次不给您太多的时间,您将ant需要关注点分离(SOC)并保持干燥(不要重复),否则会成为维护的噩梦

如果您将该代码放在视图中(这是最糟糕的地方)。1.如果您希望在其他地方使用相同或类似的代码,会发生什么情况?2.您将如何以这种方式逐步调试代码

这相当于将sql查询放在ASP.NET webforms.aspx文件中,甚至不放在代码隐藏的.aspx.cs文件中。