在这个下载app中,许多数据都应该可以排序,比如下图的“语言类型”:

再比如“授权方式”:

其实,排序功能是一个非常常见的功能,在 “我记录网站综合系统” 中,一遍又一遍的出现。现在,你不用自己去具体实现这个功能了,只要遵循如下步骤,排序功能就可以相对简单的实现出来。

下面,我们以“语言类型”(FileLang.cs)为例,来谈一下实现的步骤。

一、让 FileLang 模型实现 ISort 接口
这个接口的定义如下:

因为 FileLang 是存储在文本缓存数据库中,也就是常驻内存的,排序的时候,不能像sql语言一样使用 “order by”语句 ,所以必须实现 IComparable 接口:

取出来排序的做法是:


、在数据列表html中,修改视图文件,增加排序的那一列:

注意,这个td有一个 class 叫 "sort"

    <td class="sort">
        <img src="~img/up.gif" class="cmdUp right10" data-id="#{data.Id}"/>

        <img src="~img/dn.gif" class="cmdDown" data-id="#{data.Id}"/>

    </td>


数据表格还要增加一个排序的服务器端方法(data-sortAction):
    <table style="width: 99%;" border="0" id="dataAdminListdata-sortAction="#{sortAction}">

注意,表格的ID必须是 dataAdminList,然后还要保证当前页面已经引入了 wojilu.common.admin.js(如果是网站后台,一般都已经引入)

、在控制器中增加一个排序的方法

以后你在其它app中使用排序,可以直接拷贝本代码,稍微修改一下,即可使用。代码拷贝:

[HttpPost]

public virtual void SaveSort() {


    int id = ctx.PostInt( "id" );

    String cmd = ctx.Post( "cmd" );


    YourObject data = YourObject.findById( id );

    List<YourObject> list = YourObject.find("order by OrderId desc, Id asc").list(); // 此处不能使用原生检索,必须使用经过排序的检索方式


    if (cmd == "up") {

        new SortUtil<YourObject>( data, list ).MoveUp();

        echoRedirect( "ok" ); // 1.9开始,本行可以用 echoJsonOk() 代替

    }

    else if (cmd == "down") {

        new SortUtil<YourObject>( data, list ).MoveDown();

        echoRedirect( "ok" ); // 1.9开始,本行可以用 echoJsonOk() 代替

    }

    else {

        echoError( lang( "exUnknowCmd" ) );

    }

}


同时,前面列表action中也要给链接赋值:

代码:
set( "sortAction", to( SaveSort ) );

通过上面三个步骤,“语言类型(FileLang)”这个模型就具有了排序功能。


【常见问题】

按照步骤做了,但点击没有反应
请检查视图html中的 <table id="dataAdminList" data-sortAction="#{sortAction}" 的 sortAction 是否已经在cs中绑定?
同时检查排序按钮中的 <img src="~img/up.gif" class="cmdUp right10" data-id="#{data.Id}"/> 中的 data.Id 是否也已经绑定?


说明:
1)内部是按照OrderId由大到小排列,数值大的在前面。所以如果没有效果,需要查看数据检索的方法是否正确,比如db.find<>( "order by OrderId desc, Id asc" )
2)在 SaveSort 方法中,获取列表的方法也必须是经过排序的