当前位置 > 首页 > Asp.net

[翻译]ASP.NET MVC 3 开发的20个秘诀(七)[20 Recipes for Programming MVC 3]:对列表进行排序

2011-12-12 13:38:00来源:Asp.net

议题

现在有一个很大的列表(例如,图书列表),想找到某一项是非常难的。如果针对列表中的某一项进行排序,应该会对查找有所帮助。

解决方案

将书籍清单列表的列标题更新为链接,当链接被点击的时候,将通过Linq针对选中列的内容进行排序(通过再次点击标题链接来切换升序还是降序)。

讨论

与我之前使用过的框架相比添加排序、自动生成视图的过程让我感到有些惊讶。希望在外来的MVC版本中,他可以成为整体框架的一部分。参考ASP.NET MVC的网站首页上示例,我们需要定义一个Switch语句,每一列排序情况都需要复制一个Case来实现。还好我们的这个案例当中只有五个项需要排序,情况还不算太坏。如果以后需要针对比如作者或者其他列排序,只需要复制此Case来实现。在下面的示例中,我们将使用Dynamic Linq Library来简化工作。

Linq library 可以从数据库中查询并返回强类型结果。编程工具提供了如智能感知支持和编译时错误检测,我们很多的共奏都将基于这些功能进行操作。

在BooksController控制器和Books、Index视图中添加生成排序支持。以下是Index视图的代码:

@model IEnumerable<MvcApplication4.Models.Book>
<h2>@ViewBag.Title</h2>
<p>
@Html.ActionLink((string)ViewBag.CreateLink, "Create")
</p>

<table>
<tr>
<th>
@Html.ActionLink((string)ViewBag.TitleDisplay,
"Index", new { sortOrder = ViewBag.TitleSortParam })
</th>
<th>
@Html.ActionLink((string)ViewBag.IsbnDisplay,
"Index", new { sortOrder = ViewBag.IsbnSortParam })
</th>
<th>
@ViewBag.SummaryDisplay
</th>
<th>
@Html.ActionLink((string)ViewBag.AuthorDisplay,
"Index", new { sortOrder = ViewBag.AuthorSortParam })
</th>
<th>
@ViewBag.ThumbnailDisplay
</th>
<th>
@Html.ActionLink((string)ViewBag.PriceDisplay,
"Index", new { sortOrder = ViewBag.PriceSortParam })
</th>
<th>
@Html.ActionLink((string)ViewBag.PublishedDisplay,
"Index", new { sortOrder =
ViewBag.PublishedSortParam })
</th>
<th></th>
</tr>

@foreach (var item in Model) {
<tr>
<td>
@Html.DisplayFor(modelItem => item.Title)
</td>
<td>
@Html.DisplayFor(modelItem => item.Isbn)
</td>
<td>
@Html.DisplayFor(modelItem => item.Summary)
</td>
<td>
@Html.DisplayFor(modelItem => item.Author)
</td>
<td>
@Html.DisplayFor(modelItem => item.Thumbnail)
</td>
<td>
@Html.DisplayFor(modelItem => item.Price)
</td>
<td>
@Html.DisplayFor(modelItem => item.Published)
</td>
<td>
@Html.ActionLink((string)ViewBag.EditLink,
"Edit", new { id=item.ID }) |
@Html.ActionLink((string)ViewBag.DetailsLink,
"Details", new { id = item.ID }) |
@Html.ActionLink((string)ViewBag.DeleteLink,
"Delete", new { id = item.ID })
</td>
</tr>
}
</table>

在上面这个例子中,修改了以前创建的th标记,使用Html helper将静态文本转换为HTML链接。

接下来,需要修改BookController中的Index方法。此方法将会接受一个新的排序参数,此参数将在Linq执行查询时指定结果排序的列。更会在ViewBag创建一个新的变量存储每个列的排序条件。

Microsoft针对Linq提供了新的免费扩展DynamicQuery类,这个扩展允许在运行的时候动态生成查询语句,可以通过访问http://msdn2.microsoft.com/en-us/vcsharp/bb894665.aspx 下载到C#版本。下载后解压到硬盘的某个位置,在目录中找到这个文件并添加到项目工程中“~\CSharpSamples\LinqSamples\DynamicQuery\DynamicQuery\Dynamic.cs”。为了更好的组织代码,我们需要在项目工程中创建“Utils”文件夹,右键单击“Utils”文件夹选择“添加”->“现有项”,然后通过浏览窗口找到这个动态类(或者也可以直接通过拖拽将文件放入“Utils”目录)。 

动态类添加完成后,编辑更新BooksController:

using System;
using System.Collections.Generic;

  • 复合控件与事件(1)

    2007-7-2 4:04:00

    摘要: 关于复合控件的文章在网上已经很多了,本文只是最近自己做复合控件的一些心得体会。希望大家愿意和我分享。复合控件作为组件二次开发一个很好的方式被很多人所喜欢,理由就是它在复用性和实用性两方面做到

  • OAuth 2.0 - dotNetDR_OAuth2微博API访问组件使用教程

    2012-9-20 10:17:00

    I:组件类库的引用安装 使用NuGet安装dotNetDR_OAuth2类库,然后点击安装按钮 或者你可以利用NuGet程序包管理器控制台输入 Install-Package do

  • 使用Windows Embedded Source Tools for Bluetooth Technology简化蓝牙开发

    2009-2-6 17:48:00

    摘要: 介绍了WM6的SDK中,使用Windows Embedded Source Tools for Bluetooth Technology进行蓝牙开发的例子,并给出了演示的视频。 阅读全文

  • IE8的bug?

    2009-3-24 21:05:00

    摘要: 最近做网页,在使用IE8的过程中发现了一个很奇怪的问题:究竟<div style=clear:both; />与<div style=clear:both;><

  • 使用UI Automation实现自动化测试--4.8 (GridPattern)

    2009-9-24 17:14:00

    摘要: GridPattern支持GridPattern的最常见的控件为GridView, 在WPF中使用ListView和GridView组合即可得到相应的GridView。GridPattern

  • [原创推荐] 介绍两种WEB下的模态对话框的实现

    2009-6-3 21:58:00

    两种WEB下的模态对话框 作者:Jacky.zhou 时间:2009/06/03 概述 在如今互联网

  • .Net Web项目安装包制作 (二)数据库安装、其他组件的安装

    2010-9-12 20:27:00

    作者: steven hu 发表于 2010-09-12 16:26 原文链接 阅读: 347 评论: 1 上一节是讲述如何制作Web安装包的过程,只要按照步骤做就可以了。 这一节将讲

  • (牛人莫入)Silverlight 3 PopForm

    2009-9-27 22:56:00

    摘要: 阅读条件:本篇文章适合SL的初学者阅读,如果你不是初者请你放弃阅读;不文不将对SL的高级开发者提供认何帮助;往往项目开中会用到弹出一个窗口,并且把这个窗口中所选择的值返回到起始页面;这个功能

  • Groking Rhino Mocks

    2007-3-29 12:54:00

    If youve been in a cave for awhile, theres a uber-cool framework out there call Rhino Mocks. Mocks

  • ASP.NET统计图表控件

    2009-11-27 14:01:00

    阅读: 611 评论: 5 作者: virus 发表于 2009-11-27 12:03 原文链接   近来客户需要将前段时间开发的统计信息用图表展示出来,还要多个图表类型,例如: