Как да останете/запазите на същата страница, когато използвате PagedList.mvc

Използвам PagedList.Mvc и добавих приятен начин за навигация в различни страници в mvc уеб приложение. Когато обаче щракна върху раздела „редактиране“ или „подробности“ и запазя промените, ме връщат обратно на първата страница. Искам да остана на същата страница, където са направени промените.

Ето кода, който имам в контролера:

// 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)


Можете например да подадете допълнителен параметър „страница“ към вашия метод за редактиране

Във вашия индексен метод добавете

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"];

Код за добавяне в действието Създаване или Редактиране на подаване

    //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? страница), а дестинацията е действието създаване или редактиране. - person Oualid KTATA; 12.08.2014
comment
кодът в действие за създаване или редактиране на изпращане може да бъде опростен с TempData.Keep("page"); - person Pavol Hanzel; 05.03.2017

И аз имах този проблем.

Първо се опитах да го сложа в URL адреса, но изглежда малко странно да има ?page=2 в нашия URL адрес.

Затова го замених с 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