C# 以分页方式在MVC中显示配置文件结果的最佳方法
我犹豫了一下,正在考虑如何显示搜索结果 情况如下: 我有一个网站,在那里用户可以填写几个文本框,并在此基础上执行搜索。然后我想以分页的方式向他展示结果:比如: 照片,姓名,年龄|照片,姓名,年龄|照片,姓名年龄 所以我希望有一个3列,然后可能有5行 但我不知道,什么是最好的方式来表达这样的东西,有没有最好的方法等等C# 以分页方式在MVC中显示配置文件结果的最佳方法,c#,asp.net-mvc-3,C#,Asp.net Mvc 3,我犹豫了一下,正在考虑如何显示搜索结果 情况如下: 我有一个网站,在那里用户可以填写几个文本框,并在此基础上执行搜索。然后我想以分页的方式向他展示结果:比如: 照片,姓名,年龄|照片,姓名,年龄|照片,姓名年龄 所以我希望有一个3列,然后可能有5行 但我不知道,什么是最好的方式来表达这样的东西,有没有最好的方法等等 提前感谢嗯,有很多方法可以从不同的角度使用。我们真的可以谈论很久了。但是,简而言之,您可以在表示层、控制器层、业务逻辑层或数据层实现分页。基本上,应用程序层越低,性能就越好,在控制器
提前感谢嗯,有很多方法可以从不同的角度使用。我们真的可以谈论很久了。但是,简而言之,您可以在表示层、控制器层、业务逻辑层或数据层实现分页。基本上,应用程序层越低,性能就越好,在控制器和业务逻辑层实现分页在性能方面没有太大区别,但从设计角度来看,最好将这些问题保留在业务逻辑层,以获得更好的可维护性和可伸缩性。如果在数据层实现分页,您将获得更好的性能,特别是如果您有大量数据要显示,然后告诉数据访问层仅获取应用程序感兴趣的数据页。使用其他方法将迫使您从后端存储检索所有数据,这可能会导致不必要的带宽消耗和数据传输。请参见下面的示例,其中我在数据层级别执行分页 例子 SQL查询 我正在使用一个自定义数据访问层,它运行下面的sql查询来查询大量设备
select top (@pagesize) *
from
(
select row_number() over(order by d.Name) as RowId
, d.Id
, d.Name
, d.IsDeleted
, dt.Id as DeviceTypeId
, dt.Name as DeviceTypeName
from Devices d
left join DeviceTypes dt on dt.Id = d.DeviceTypeId
)
as o
where o.RowId <= (@page * @pagesize) and o.RowId > ((@page - 1) * @pagesize)
看法
该视图几乎只是HTML和razor语法,没有什么有趣的地方。也许,表/网格的页脚是发生更有趣事情的地方,因为分页标记是在那里定义的
<tfoot>
<tr>
<td colspan="4">
<div class="pager">
@using (Html.BeginForm("Manage", "Devices", FormMethod.Get)){
@Html.TextBoxFor(x => x.CurrentPage, new { title = "Enter a page number to change the page results" })
<input type="submit" value="Go" title="Change the current page result" />
}
</div>
<div class="total">
@Model.ActualCount record(s) found
</div>
</td>
</tr>
</tfoot>
@使用(Html.BeginForm(“管理”、“设备”、FormMethod.Get)){
@TextBoxFor(x=>x.CurrentPage,new{title=“输入页码以更改页面结果”})
}
@找到了Model.ActualCount记录
这就是它的样子
请注意,在我的视图中的表的tfoot
部分中,我添加了一个form
元素,该元素向我的操作方法Manage
发出GET
请求,而不是POST
请求。这对于提供一个很好的restful url非常有用,用户可以在其中手动指定他们感兴趣的页面
我希望它能帮助你获得一些基本的想法是的,我只是想知道如何安排它,我的意思是我必须把它保存在某个地方,同时用分页生成一个结果集……如果我使用EF,它仍然应该是一样的呢?我指的是DAL,因为我不确定是否可以指定要通过页面检索的数据。。。想象一下,如果在更改过程中,应该显示一些额外的设备,例如,它们变为活动设备(并且您希望显示所有激活设备),通常情况下,您会得到100个结果,每页10个,10个页面,但在几页之后,只有105个设备联机。这只是您的解决方案的模板。在EF中,您可以使用
Skip
和Take
。如果您想添加任何条件,那么,这就是为什么sql中有where
子句的原因,只要确保相同的条件与count查询匹配即可。是否足够清楚?是的,或多或少,关于每页EF获取的一个澄清动作是:它是这样的:(context.users where user.Online==true选择u)。Take(10)Skip(PageSize*PageIndex)
…假设PageIndex
是零基的,然后Take(PageSize)
…看看这个
public class DevicesController : Controller
{
public ActionResult Manage(string currentPage)
{
return process_device_list(currentPage);
}
//this method was created as a result of code re-factoring since it is used in several other action methods not shown here
private ActionResult process_device_list(string currentPage, bool redirect = false)
{
int count = 0;
int page = 1;
if (!int.TryParse(currentPage, out page))
{
if (!string.IsNullOrEmpty(currentPage))
return RedirectToAction("Manage");
page = 1;
}
var model = new DeviceManagementListModel();
model.Devices = BusinessFactory.DevicesLogic.GetAllDevices(page, out count);
model.ActualCount = count;
model.CurrentPage = page;
if (!redirect)
return View(model);
else
return RedirectToAction("Manage", new { @currentPage = currentPage });
}
}
<tfoot>
<tr>
<td colspan="4">
<div class="pager">
@using (Html.BeginForm("Manage", "Devices", FormMethod.Get)){
@Html.TextBoxFor(x => x.CurrentPage, new { title = "Enter a page number to change the page results" })
<input type="submit" value="Go" title="Change the current page result" />
}
</div>
<div class="total">
@Model.ActualCount record(s) found
</div>
</td>
</tr>
</tfoot>