我犹豫并考虑如何显示结果搜索。
情况如下: 我有一个网站,用户可以在其中填写几个texbox并根据它执行搜索。然后我想以分页方式向他显示结果:类似于:
照片,姓名,年龄|照片,名字,年龄|照片,名字年龄
所以我希望有3列,然后可能有5行。
但我不知道,代表这样的事情的最佳方法是什么,是否有最好的方法等?
提前致谢
答案 0 :(得分:1)
嗯,从许多不同的角度来看,你可以采用很多方法。我们真的可以谈论它多年了。但是,简而言之,您可以在表示层,控制器级别,业务逻辑层或数据层实现分页。基本上,你的应用程序层越低,性能越好,在控制器和业务逻辑层实现分页时,在性能方面没有太大区别,但设计明智的是,最好将这些问题留在业务中逻辑层,以实现更好的可维护性和可伸缩性。如果在数据层实现分页,您将获得更好的性能,特别是如果要显示大量数据,然后告诉数据访问层仅获取应用程序感兴趣的数据页面。使用其他方法将强制您要检索后端存储中的所有数据,这可能会导致不必要的带宽消耗和数据传输。请参阅下面的示例,我正在数据层级进行分页。
我正在使用自定义数据访问层运行下面的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)
查询很简单,您可以指定页面大小(每个数据页面的记录)和要检索的数据页面(第一页,第二页等)。此查询由我的数据访问层运行,该层构造业务对象并将其传递给业务逻辑层
然后,在我的业务逻辑中,我调用了设备数据对象来检索我感兴趣的数据页面。以下方法可以完成这项工作......
public IList<DeviceBO> GetAllDevices(int page, out int count)
{
count = DataProvider.Devices.GetAllDevicesCount();
return DataProvider.Devices.GetAllDevices(page, BusinessConstants.GRID_PAGE_SIZE);
}
非常直接的操作。然而,有一些事情需要注意。一,我正在两次往返数据库;一个用于获取所有设备的计数,另一个用于检索设备的数据页。我们可以争辩说这可以通过单次访问数据库来避免这种情况,但在我的情况下,这是一个非常快速的查询,运行时间不到1秒,相信我......我有超过一百万条记录。对GetAllDevicesCount
的调用只不过是一个sql select count(Id) from dbo.Devices
另请注意DataProvider
只是一个工厂对象。您实际上不需要担心实现细节。并且BusinessConstants.GRID_PAGE_SIZE
simple返回一个数字,在我的应用程序中使用的标准页面大小(我有一些网格/表格),这只是一种将事物保存在一个地方的方法,以防我想要更改页面大小稍后在所有网格/表格中。
然后我定义了一个暴露以下操作方法的设备控制器(Manage)...
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 });
}
}
视图几乎只是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>
这就是它的样子......
请注意,在我的视图中,我在表格的tfoot
部分添加了一个form
元素,该请求对我的操作方法GET
发出Manage
个请求,而不是POST
请求。这对于提供一个很好的restful url非常有用,用户可以手动指定他们感兴趣的页面...
我希望它可以帮助你获得一些基本的想法