技术开发 频道

ASP.NET MVC中对数据进行排序的方法

  现在我们可以看到,从局部视图中可以通过Model属性访问在Sortable视图中的任何值了,访问的方法是通过ViewData[“name”]即可。还要记得,我们之所以要在这里使用局部视图,其目的为某个特定的列生成超级链接。

  我们接下来要判断某个列是否要升序还是降序排列,下面的代码创建了isDescending变量,这个值只有当要排序的列(由Model.SortBy产生)和数据库中的列名相同(由ViewDate[“ColumnName”]产生)时,并且当前的排序为升序(Model.SortAscending)时,其值才为True。

var isDescending = string.CompareOrdinal(Model.SortBy, ViewData["ColumnName"].ToString()) == 0 && Model.SortAscending;

  同时,我们最好通过设置CSS样式,告诉用户当前的排序方向,因此我们在 CustomStyles.css的CSS类定义了两个CSS类-sortAsc和sortDesc,增加了一个向上或向下箭头,可以用如下代码去判断:

f (string.CompareOrdinal(Model.SortBy, ViewData["ColumnName"].ToString()) == 0)
{
  
if (Model.SortAscending)
      htmlAttributes.Add(
"class", "sortAsc");
  
else
      htmlAttributes.Add(
"class", "sortDesc");

  最后,完成的局部视图代码如下:

<%
   var isDescending
= string.CompareOrdinal(Model.SortBy, ViewData["ColumnName"].ToString()) == 0 && Model.SortAscending;

   var routeData
= new RouteValueDictionary { { "sortBy", ViewData["ColumnName"].ToString() }, { "ascending", !isDescending } };

   var htmlAttributes
= new Dictionary<string, object>();
  
if (string.CompareOrdinal(Model.SortBy, ViewData["ColumnName"].ToString()) == 0)
   {
      
if (Model.SortAscending)
         htmlAttributes.Add(
"class", "sortAsc");
      
else
         htmlAttributes.Add(
"class", "sortDesc");
   }
%>

<%: Html.ActionLink(
      ViewData[
"DisplayName"].ToString(),                         // Link Text
      Html.ViewContext.RouteData.Values["action"].ToString(),     // Action
      Html.ViewContext.RouteData.Values["controller"].ToString(), // Controller
      routeData,                                                  // Route data
      htmlAttributes                                              // HTML attributes to apply to hyperlink
   )
%>

  Html.ActionLink方法会向浏览器端产生超链接的HTML。它的第一个参数为要显示的文字超链接的标题,这里通过ViewData[“displayname“]读取。

  第二个和第三个参数指定了action和控制器去生成链接,我们使用Html.ViewContext.RouteData.Values[“action“].ToString

  和Html.ViewContext.RouteData.Values[“controller“].ToString()来获得当前请求的action和控制器,而避免了硬编码。

  第四个输入参数指定了路由的数据,这是我们用RouteValueDictionary字典的形式,分别向sortBy和ascending参数传入值。

  最后的参数设定了生成链接的HTML的CSS样式。

  当运行程序后,默认是按产品名称升序排序的,如下图。

下载的到

  当点产品标题列旁边的小箭头时,会向控制器发出如

  Products/Sortable?sortBy=ProductName&ascending=False的请求,于是产品名称按降序排序了,如下图:

下载的到

  本文的代码可以在:http://aspnet.4guysfromrolla.com/code/GridDemosMVC.zip下载得到。

0
相关文章