现在我们可以看到,从局部视图中可以通过Model属性访问在Sortable视图中的任何值了,访问的方法是通过ViewData[“name”]即可。还要记得,我们之所以要在这里使用局部视图,其目的为某个特定的列生成超级链接。
我们接下来要判断某个列是否要升序还是降序排列,下面的代码创建了isDescending变量,这个值只有当要排序的列(由Model.SortBy产生)和数据库中的列名相同(由ViewDate[“ColumnName”]产生)时,并且当前的排序为升序(Model.SortAscending)时,其值才为True。
同时,我们最好通过设置CSS样式,告诉用户当前的排序方向,因此我们在 CustomStyles.css的CSS类定义了两个CSS类-sortAsc和sortDesc,增加了一个向上或向下箭头,可以用如下代码去判断:
{
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下载得到。