我正在使用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 }))
请帮忙!
答案 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>