繁体   English   中英

ASP.Net MVC 4 Razor-通过Webgrid上的搜索结果进行分页

[英]ASP.Net MVC 4 Razor - Paging through search results on webgrid

我创建了一个搜索页面,该页面返回要在网络网格上显示的对象的列表。 我正在使用webgrids的默认分页。 当我尝试翻页到搜索结果的第二页时会出现问题-我被带回到搜索页。 如何使用剃须刀webgrid的默认分页功能并通过搜索结果实现分页?

动作方法:

  [HttpPost]
    public ActionResult GetEmails(UserResponse response )
    {
        if (response.RefId != null)
        {
            int refID = Convert.ToInt32(response.RefType);
            var query = from c in db.tb_EmailQueue
                        where c.ReferenceTypeId == refID && c.ReferenceId.Contains(response.RefId)
                        select c;

            var results = new List<tb_EmailQueue>();

            results.AddRange(query);

            return View("Index", results);
        }
      return View();

      }

搜索页面视图:

    <body>
@using (Html.BeginForm())
         {
           @Html.DropDownListFor(x=> x.RefType, (IEnumerable<SelectListItem>)  ViewBag.Categories,"Please select reference type") 

    <br/>

    <p>Reference Type</p>
    @Html.TextBoxFor(x => x.RefId)
 <input type ="submit" value="Submit" />

}

@using (Html.BeginForm())
{
    @Html.TextBoxFor(x=>x.Date, new{@id="example1"})
    <input type ="submit" value="Submit" />
    <br/>

}

结果显示视图:

    @{
if (Model.Any())
{
    var grid = new WebGrid(Model, canPage: true, rowsPerPage: 100);


    @grid.GetHtml(tableStyle: "table table-striped table-bordered", columns: grid.Columns(
        grid.Column(header: "EmailQueueId",
                    columnName: "EmailQueueId",
                    format: item => Html.ActionLink(((int) item.EmailQueueId).ToString(), "Details", new {id = item.EmailQueueId})),
        grid.Column("QueueDateTime", canSort: true, format: @<text>@item.QueueDateTime.ToString("dd/MM/yy H:mm:ss")</text>),
        grid.Column("ReferenceTypeID"),
        grid.Column("ReferenceID"),
        grid.Column(header: "ToList",
                    columnName: "ToList",
                    format: @<input type ="text" value="@item.ToList"  title="@item.ToList" readonly="readonly"/>),
        grid.Column(header: "Subject",
                    columnName: "Subject",
                    format: @<input type ="text" value="@item.Subject" title ="@item.Subject" readonly="readonly"/>),
        grid.Column("FailureCount")
                                                                        ))
}

else
{
    <p>No records</p>
}
}

由于您得到了要查询的页码,并且知道要查找多少结果,因此您只不过在LINQ查询中遗漏了一部分。 我不使用SQL语法,因此请原谅,尽管它应该很容易转换为您的方法。

var query = (from c in db.tb_EmailQueue
            where c.ReferenceTypeId == refID && c.ReferenceId.Contains(response.RefId)
            select c).Skip((pageNumber - 1) * pageSize).Take(pageSize);

您想要(pageNumber - 1)因为您的pageNumber将基于1,并且如果您正在寻找第一页,则您不想跳过任何内容(0 * pageSize) 有了这些结果,您只想Take()即可在页面上显示很多。

Mike Brind在本文中解决了ASP.NET Web Pages框架的问题:使用WebGrid对表的筛选子集进行分页和排序问题: 在WebGrid中显示搜索结果

我曾尝试在MVC中对其进行翻译,但是我对Web页面更满意,因此要宽容。

调节器

public ActionResult Customers(string country)
{
    var search = (country == null ? "" : country);
    NORTHWNDEntities db = new NORTHWNDEntities();
    var query = from c in db.Customers
                where c.Country.Contains(search)
                select c;
    var results = new List<Customers>();
    results.AddRange(query);

    return View("Customers", results);
}

视图

@{
    var grid = new WebGrid(Model, rowsPerPage:5);
}

<hgroup class="title">
    <h1>Customers</h1>
</hgroup>

<section id="searchForm">
    @using (Html.BeginForm()){
        <p>
            Country: @Html.TextBox("Country", @Request["Country"]) 
            <input type="submit" />
        </p>
    }
</section>
<section>
    <div>
        @grid.GetHtml(columns:grid.Columns(
            grid.Column(columnName:"CompanyName",header:"Name"),
            grid.Column(columnName:"Address"),
            grid.Column(columnName:"City"),
            grid.Column(columnName:"Country")
        ))
    </div>
</section>

@section scripts{
    <script type="text/javascript">
   $(function(){
       $('th a, tfoot a').on('click', function () {
            $('form').attr('action', $(this).attr('href')).submit();
            return false;
        });
    });
    </script>
}

我已经使用了罗斯文样本数据库; 如果要使用我的同一个数据库,可以在此链接上找到它。

该解决方案将搜索表单和WebGrid保留在同一页面中,因为每次更改分页或排序顺序时,都必须重新发布搜索条件以过滤表。

根据Mike Brind的说法,“ 问题的答案在于脚本部分中显示的jQuery代码段。处理程序附加到表头和表脚区域中的链接的onclick事件上-或排序和分页链接单击它们时,将获取链接的值并将其提供给表单的action属性,然后使用POST提交表单,并通过返回false取消GET请求,从而确保将分页和排序信息保留在表单中。 Request.QueryString集合,而任何表单字段值都在Request.Form集合中传递。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM