在MVC 3中使用Pagination与DataTable对象

时间:2012-07-11 14:02:30

标签: c# database asp.net-mvc-3 datatable

我从控制器接收一个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对象的解决方案。

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

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);            
    }

2 个答案:

答案 0 :(得分:2)

正如已经指出的那样,分页通常是在服务器端完成的,这样你就可以获得限制线路上的内容以及限制用户必须接受的内容。但是,如果你只关心用户体验而不是页面带宽,那么你可以使用knockout等JavaScript库进行客户端分页。请查看此knockout paging链接,了解有关如何完成客户端分页的信息。

答案 1 :(得分:0)

为了解决这个问题,我不得不重写控制器方法,以便将DataTable转换为User对象列表,然后将此列表传递给视图。通过这样做,我可以使用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>)
  ))