Как остаться/сохранить на той же странице при использовании PagedList.mvc

Я использую PagedList.Mvc и добавил удобный способ навигации по различным страницам в веб-приложении mvc. Однако, когда я нажимаю на вкладку «Изменить» или «Подробности» и сохраняю изменения, меня возвращают на 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 }))

Пожалуйста помоги!


person Theo    schedule 12.08.2014    source источник


Ответы (3)


Вы можете передать дополнительный параметр страницы в свой метод редактирования, например

В методе 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 });
person Community    schedule 12.08.2014

В этом случае страница хранится в ViewBag, что делает ее эфемерной (ViewBag доступен только для текущего запроса).

В контроллере вы сообщаете об этом, если получаете нулевое использование 1 в качестве текущей страницы. поэтому null всегда перенастраивается, и вы каждый раз получаете 1-ю страницу.

Вам необходимо указать номер текущей страницы для ваших представлений, к которым вы переходите (редактировать/создать), а затем предоставить его обратно на исходную страницу, когда вы закончите. Вы можете использовать TempData, который хорошо работает с перенаправлениями HTTP и живет дольше, чем viewbag или viewData. Вы также можете перемещать его вместе со своими моделями при вызове действий, а затем возвращать его действию индекса, которому требуется номер страницы. Вы также можете использовать сеансы. Кстати, TempData использует сеанс за кулисами. ОБНОВЛЕНО: код для добавления в действие индекса:

var page = TempData["page"];

Код для добавления в действие Create или Edit Submit

    //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"] при повторном вызове действия индекса. Вы также можете получить к нему доступ непосредственно из действия индекса, поскольку мы повторно заполнили его:

var page = TempData["page"];  
return View(items.ToList().ToPagedList(page ?? 1, 3)); 
person Oualid KTATA    schedule 12.08.2014
comment
Как мне это сделать? Анонимный тип не может иметь несколько свойств с одним и тем же именем... - person Theo; 12.08.2014
comment
Просто добавьте TempData[page] = pageNumber; в действии, где вы установили его в первый раз, и получите его следующим образом из целевого действия: var page = TempData[page]; Затем вы можете снова вернуть его из этого действия в источник, вызвав действие с соответствующим номером страницы в качестве параметра. В вашем случае источником является индекс (int? page), а пунктом назначения является действие создания или редактирования. - person Oualid KTATA; 12.08.2014
comment
код в Создать или изменить действие отправки можно упростить с помощью TempData.Keep("page"); - person Pavol Hanzel; 05.03.2017

У меня также была эта проблема.

Сначала я пытался поместить его в 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() вместо 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>
person Jeremiah Flaga    schedule 13.07.2018