使用PagedList.mvc时如何保留/保留在同一页面上

时间:2014-08-12 18:32:29

标签: asp.net-mvc paging pagedlist

我正在使用PagedList.Mvc,我添加了一种很好的方式来浏览mvc Web应用程序中的各个页面。但是,当我点击“编辑”或“详细信息”选项卡并保存更改时,我将被发送回第1页。我希望保留在进行更改的同一页面上。

以下是我在控制器中的代码:

// GET: Item
    public ActionResult Index(int? page)
    {
        var items = db.Items.Include(i => i.PurchaseOrder);
        return View(items.ToList().ToPagedList(page ?? 1, 3));
    }

以下是我在视图中的代码:

    @using PagedList;
@using PagedList.Mvc;

@model IPagedList<PurchaseOrders.Models.Item>

@{
    ViewBag.Title = "Index";
}

<h2>Index</h2>

<p>
    @Html.ActionLink("Create New", "Create")
</p>
<table class="table">
    <tr>
        <th>
            @Html.DisplayNameFor(model => model.First().ItemDescription)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.First().Quantity)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.First().Price)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.First().DueDate)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.First().DateReceived)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.First().Comments)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.First().PurchaseOrder.PurchaseRequest_)
        </th>
        <th></th>
    </tr>

@foreach (var item in Model) {
    <tr>
        <td>
            @Html.DisplayFor(modelItem => item.ItemDescription)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.Quantity)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.Price)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.DueDate)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.DateReceived)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.Comments)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.PurchaseOrder.PurchaseRequest_)
        </td>
        <td>
            @Html.ActionLink("Edit", "Edit", new { id=item.ItemId }) |
            @Html.ActionLink("Details", "Details", new { id=item.ItemId }) |
            @Html.ActionLink("Delete", "Delete", new { id=item.ItemId })
        </td>
    </tr>
}
</table>
@Html.PagedListPager(Model, page => Url.Action("Index", new { page }))

请帮忙!

3 个答案:

答案 0 :(得分:4)

您可以将额外的“page”参数传递给编辑方法,例如

在Index方法中,添加

ViewBag.CurrentPage = page; // or use a view model property

然后您的链接将是

@Html.ActionLink("Edit", "Edit", new { id=item.ItemId, page = ViewBag.CurrentPage})

然后你的编辑方法

[HttpGet]
public ActionResult Edit(int ID, int page)
{
  ViewBag.CurrentPage = page; // pass current page to edit view

您的编辑视图

 @using (Html.BeginForm(new { page = ViewBag.CurrentPage })) {

并在你发布方法

[HttpGet]
public ActionResult Edit(EditModel model, int page)
{
  .... // Save 
  return RedirectToAction("Index", new { page = page });

答案 1 :(得分:1)

在这种情况下,页面存储在ViewBag中,使其短暂(ViewBag仅适用于当前请求)。

在控制器中,如果你将null使用1作为当前页面,则告诉它。所以null总是被重新调整,你每次都会得到第一页。

您需要将当前页码提供给导航到的视图(编辑/创建),然后在完成后将其提供回原始页面。 您可以使用TempData,它在HTTP重定向上运行良好,并且比viewbag或viewData更长寿。 您还可以在调用操作时将其与模型一起移动,然后将其返回到需要页码的索引操作。 你也可以使用会话。顺便说一句,TempData正在幕后使用会话。 更新: 要在索引操作中添加的代码:

var page = TempData["page"];

要在“创建或编辑提交”操作中添加的代码

    //Get the page number
   var page = TempData["page"];
   //Set it back to Tempdata (because Tempdata is only for redirects) otherwise it will be lost
   TempData["page"]=page;

在再次回调索引操作时,将参数的值添加到TempData [“page”] 您可以直接从Index操作访问它,因为我们重新填充它:

var page = TempData["page"];  
return View(items.ToList().ToPagedList(page ?? 1, 3)); 

答案 2 :(得分:0)

我也有这个问题。

我最初尝试将其放在URL中,但是在我们的URL中插入?page=2似乎有点奇怪。

所以我用TempData

替换了它

您需要做的是这样

在使用TempData操作方法时,将页面存储在Index()中;

public const string PAGE_QUERY_STRING_KEY = "page";

public ActionResult Index(int page = 1)
{
    TempData[PAGE_QUERY_STRING_KEY] = page;

    ...
}

然后在其他任何地方(与您当前的TempData.Peek()页相关的to retain the value of your page between requests)使用TempData[]而不是Index ---在“编辑”,“创建”,“详细信息”中等操作方法:

public ActionResult Edit(...)
{
    ...

    return RedirectToAction(nameof(Index), new { page = TempData.Peek(PAGE_QUERY_STRING_KEY) });

    // do not do this because this will remove the temp data
    // return RedirectToAction(nameof(Index), new { page = TempData[PAGE_QUERY_STRING_KEY])
}

...并在您看来:

<!--(Edit.cshtml)-->
...
<p>
    @Html.ActionLink("Back to List", "Index", 
        new { page = TempData.Peek(FLP.Web.Controllers.UsersAdminController.PAGE_QUERY_STRING_KEY) })
</p>