显示配置文件的最佳方式是以分页方式生成MVC

时间:2014-01-05 15:14:04

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

我犹豫并考虑如何显示结果搜索。

情况如下: 我有一个网站,用户可以在其中填写几个texbox并根据它执行搜索。然后我想以分页方式向他显示结果:类似于:

照片,姓名,年龄|照片,名字,年龄|照片,名字年龄

所以我希望有3列,然后可能有5行。

但我不知道,代表这样的事情的最佳方法是什么,是否有最好的方法等?

提前致谢

1 个答案:

答案 0 :(得分:1)

嗯,从许多不同的角度来看,你可以采用很多方法。我们真的可以谈论它多年了。但是,简而言之,您可以在表示层,控制器级别,业务逻辑层或数据层实现分页。基本上,你的应用程序层越低,性能越好,在控制器和业务逻辑层实现分页时,在性能方面没有太大区别,但设计明智的是,最好将这些问题留在业务中逻辑层,以实现更好的可维护性和可伸缩性。如果在数据层实现分页,您将获得更好的性能,特别是如果要显示大量数据,然后告诉数据访问层仅获取应用程序感兴趣的数据页面。使用其他方法将强制您要检索后端存储中的所有数据,这可能会导致不必要的带宽消耗和数据传输。请参阅下面的示例,我正在数据层级进行分页。

实施例

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)

查询很简单,您可以指定页面大小(每个数据页面的记录)和要检索的数据页面(第一页,第二页等)。此查询由我的数据访问层运行,该层构造业务对象并将其传递给业务逻辑层

业务逻辑

然后,在我的业务逻辑中,我调用了设备数据对象来检索我感兴趣的数据页面。以下方法可以完成这项工作......

  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>

这就是它的样子......

enter image description here

请注意,在我的视图中,我在表格的tfoot部分添加了一个form元素,该请求对我的操作方法GET发出Manage个请求,而不是POST请求。这对于提供一个很好的restful url非常有用,用户可以手动指定他们感兴趣的页面...

enter image description here

我希望它可以帮助你获得一些基本的想法