1

我从控制器接收一个 DataTable 对象,并使用它在视图中显示一个表,代码如下:

@model System.Data.DataTable 

<table width="65%">
<tr>        

    <th>USERNAME</th>
    <th>ROLE</th>
    <th>ACTIVE</th>
    <th></th>
    <th></th>

</tr>

@foreach(DataRow row in Model.Rows)
{
    <tr>           

        @foreach (DataColumn column in Model.Columns)
        {
            <td>@row[column]</td>   
        }

        <td>@Html.ActionLink("Edit", "Edit", new { id = row[0] })</td>
        <td>@Html.ActionLink("Delete", "Delete",new{id=row[0]})</td>              

    </tr>        
}
</table>

我想添加分页,这样当表格中填充了大量数据时,用户不必长时间向下滚动。这是一个基本的学习练习,我在相关控制器操作方法中对所有数据库 SQL 调用进行了硬编码。我没有使用像 NHibernate 这样的 ORM,所以理想情况下我正在寻找一种仅在服务器端使用 DataTable 对象的解决方案。

这是来自控制器的代码(删除了数据库细节):

public ActionResult Index()
    {            
        string oradb = "Data Source = XXXXXXXXXXXXXXXXXXX";

        OracleConnection conn = new OracleConnection(oradb);

        conn.Open();

        string sql = " SELECT USER_ROLE_ID, USERNAME, ROLE, ACTIVE_IND FROM LD_USER_ROLE";

        OracleDataAdapter adapter = new OracleDataAdapter(sql, conn);
        DataTable dt = new DataTable();
        adapter.Fill(dt);

        conn.Close();


        return View(dt);            
    }
4

2 回答 2

2

正如已经指出的,分页通常是在服务器端完成的,这样您就可以获得限制通过网络传输的内容以及限制用户必须接受的内容的好处。但是,如果您只关心用户体验而不是那么关于页面带宽,您可以使用 JavaScript 库(例如knockout )进行客户端分页。查看此淘汰分页链接以获取有关如何完成客户端分页的信息。

于 2012-07-11T14:20:47.833 回答
0

为了解决这个问题,我必须重写控制器方法,以便它将 DataTable 转换为用户对象列表,然后我将这个列表传递给视图。通过这样做,我就可以使用 WebGrid 对象,它可以轻松进行分页。控制器代码还使用 dataAccess 对象来封装一些数据库信息和调用。

控制器代码:

public ActionResult Index()
    {
        UserRoleDAL udl = new UserRoleDAL();
        DataSet ds = udl.GetData(" SELECT USER_ROLE_ID, USERNAME, ROLE, ACTIVE_IND FROM LD_USER_ROLE");


        var ZUsers = new List<ZUserRoleModel>();

        if (ds.Tables.Count > 0 && ds.Tables[0].Rows.Count > 0)
        {
            for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
            {
                var dr = ds.Tables[0].Rows[i];


                var ZUser = new ZUserRoleModel()
                {
                    UserRoleId = Convert.ToInt64(dr["USER_ROLE_ID"]),
                    UserName = dr["USERNAME"].ToString(),
                    Role = dr["ROLE"].ToString(),
                    ActiveInd = ActiveBool
                };
                ZUsers.Add(ZUser);
            }
        }

        return View(ZUsers);
    }

查看代码:

@model IEnumerable<CIMsWebApp.Models.ZUserRoleModel>



@{  var grid = new WebGrid(Model, canSort: false, canPage: true, rowsPerPage:25); }


@grid.GetHtml(
                tableStyle: "dataGrid", 
                headerStyle: "header",
                alternatingRowStyle: "evenRow", 
                columns: grid.Columns
  (
          grid.Column(header: "UserName", columnName: "UserName"),
          grid.Column(header: "Role ", columnName: "Role"),
          grid.Column(header: "Active", columnName: "ActiveInd"),
          grid.Column(header: "Edit", format: @<text>@Html.ActionLink("Edit", "Edit",  new { id = @item.UserRoleId })</text>),
          grid.Column(header: "Delete", format: @<text>@Html.ActionLink("Delete", "Delete", new { id = @item.UserRoleId })</text>)
  ))
于 2012-08-10T08:56:53.793 回答