Asp.net mvc 我们是否可以在asp net mvc视图中直接执行LINQ
通过查看我们正在进行的项目(ASP MVC 3.0),我在我的一个ASPX视图中看到了这部分代码: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
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行;也许这有点夸张,但你明白了)
为了使应用程序代码具有一致性、可维护性和可重用性,将这些类型的逻辑放在业务逻辑类上,而不是在控制器或视图上编写。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文件中。