C# 以分页方式在MVC中显示配置文件结果的最佳方法

C# 以分页方式在MVC中显示配置文件结果的最佳方法,c#,asp.net-mvc-3,C#,Asp.net Mvc 3,我犹豫了一下,正在考虑如何显示搜索结果 情况如下: 我有一个网站,在那里用户可以填写几个文本框,并在此基础上执行搜索。然后我想以分页的方式向他展示结果:比如: 照片,姓名,年龄|照片,姓名,年龄|照片,姓名年龄 所以我希望有一个3列,然后可能有5行 但我不知道,什么是最好的方式来表达这样的东西,有没有最好的方法等等 提前感谢嗯,有很多方法可以从不同的角度使用。我们真的可以谈论很久了。但是,简而言之,您可以在表示层、控制器层、业务逻辑层或数据层实现分页。基本上,应用程序层越低,性能就越好,在控制器

我犹豫了一下,正在考虑如何显示搜索结果

情况如下: 我有一个网站,在那里用户可以填写几个文本框,并在此基础上执行搜索。然后我想以分页的方式向他展示结果:比如:

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

所以我希望有一个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>