我从控制器接收一个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);
}
答案 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>)
))