Как предотвратить потерю объектов между вызовами PagedList?

Справочная информация:

Я использую PagedList MVC для обеспечения подкачки большого набора данных в моем представлении.

Проблема:

У меня есть форма в моем представлении, которая передает объект, заполненный параметрами пользователя на входах формы, в метод на контроллере, называемый IndexЯ также передаю номер страницы, по которой пользователи тоже хотят перемещаться. Первый раз, когда форма передается в объект метода контроллера, заполняется из формы, как и ожидалось, когда я нажимаю на второй странице, я передаю нулевые свойства объекту.

Это имеет смысл, так как пользователи больше не отправляют форму, но у меня сейчас есть проблема, когда я потерял параметры оригинального фильтра.

Как я могу сохранить оригинальные отфильтрованные параметры, которые заполняют модель, и отправлять их каждый раз, когда пользователь меняет страницу?

Код:

Вид с формой и моделью:

            @using (Ajax.BeginForm("Index", "ShopComparator", new AjaxOptions { UpdateTargetId = "result", OnBegin = "LoadingSpinner", OnSuccess = "MessageSent", OnFailure = "FailedMail" }))
        {
            @Html.ValidationSummary(true)

            <div class="row">
                <div class="col-lg-12">
                    <div class="form-group">
                        <div class="row">
                            <div class="col-lg-4 form-group">
                                @Html.TextBoxFor(m => m.SearchValues.searchTerm, new { @class = " form-control", placeHolder = "Item to search for", id = "name" })
                                @Html.ValidationMessageFor(model => model.SearchValues.searchTerm)

                            </div>
                            <div class="col-lg-5 form-group">

                                @Html.DropDownListFor(x => x.SearchValues.searchCatagory, new SelectList(Model.GetCatagories), "Select Product Catagory", new { @class = "form-control" })

                            </div>

                            <div class="col-lg-3 form-group">

                                @Html.DropDownListFor(x => x.SearchValues.countryCode, new SelectList(new List<string> {
                        "UK",
                        "US",
                        "FR",
                        "DE",
                   }), "Select Code", new { @class = "form-control" })


                            </div>
                        </div>
                        <div class="row">
                            <div class="col-sm-12 form-group">

                                <input type="submit" class="btn btn-primary btn-block" value="Search Prices" />
                            </div>

                        </div>
                    </div>
                </div>
            </div>
        }

Метод Index на контроллере HomePage, который вызывается вышеуказанной формой вместе с заполненным HomePageVM Объект передается из формы вместе с номером страницы. Модель HomepageVM имеет нулевые свойства после последующих изменений страницы со страницы 1.

    public ActionResult Index(HomePageVM homePageSearch, int pageNo = 1)
    { 
        RootObject response = _httpCaller.CallWebApiEndPoint(homePageSearch.SearchValues.searchTerm, homePageSearch.SearchValues.searchCatagory, homePageSearch.SearchValues.countryCode);

        List<ViewDisplayItem> viewModelResponseList = ConvertToViewModel(response);


        return View(viewModelResponseList.ToPagedList(pageNo, 3));
    }

Индексное представление, которое отображает элементы, которые будут выгружены:

  @foreach (var item in @Model)
        {
                <div class="col-lg-4">
                    <div class="panel panel-default">
                        <div class="panel-heading textOverflow" id="panelHeading">
                            <h3 class="panel-title text-center"><b>@item.Title</b></h3>
                        </div>
                        <div class="panel-body">
                            <a href="@item.url"><img src="@item.Image" class="picHeight img-rounded img-responsive center-block" /></a>
                            <h4 class="text-center">@item.Price</h4>
                            <h4 class="text-center"><a href="@item.url" class="btn btn-success">See More</a></h4>
                            <h4 class="text-center">@item.Origin</h4>
                        </div>
                    </div>
                </div>
        }
    </div>
</div>
<div class="col-lg-12 col-md-12 col-sm-12 text-center">
    @Html.PagedListPager(Model, page => Url.Action("Index", new { pageNo = page }), PagedListRenderOptions.OnlyShowFivePagesAtATime)
</div>

РЕДАКТИРОВАТЬ

Я взял комментарии Стивенса на борт и теперь у меня есть обновленное решение. Это почти рабочий путь дает ноль HomePageVM объект при передаче обратно в контроллер на второй странице.

Код:

Обновленная модель HomePageVM:

public class HomePageVM
{
    public List<string> GetCatagories { set; get; }

    public HomePageSearchVM SearchValues { set; get; }
}

public class HomePageSearchVM
{
    public string searchTerm { set; get; }
    public string searchCatagory { set; get; }
    public string countryCode { set; get; }
}

HomepageDisplayItems:

  public class HomepageDisplayItems
{
    public HomePageVM SearchProperties { set; get; }
    public PagedList<ViewDisplayItem> DisplayItems { set; get; }
}

контроллер:

public ActionResult Index(HomePageVM homePageSearch, int pageNo = 1)
    { 
        RootObject response = _httpCaller.CallWebApiEndPoint(homePageSearch.SearchValues.searchTerm, homePageSearch.SearchValues.searchCatagory, homePageSearch.SearchValues.countryCode);

        List<ViewDisplayItem> viewModelResponseList = ConvertToViewModel(response);

        var displayObj = new HomepageDisplayItems()
        {
            SearchProperties = homePageSearch,
            DisplayItems = new PagedList<ViewDisplayItem>(viewModelResponseList, pageNo, 12)
        };

        return View(displayObj);
    }

Index.cshtml:

ПРИМЕЧАНИЕ. Установка homePageSearch для объекта model.SearchProperties

@using PagedList.Mvc

@model ShopComparisonEngine.Models.HomepageDisplayItems

......


@Html.PagedListPager(Model.DisplayItems, page => Url.Action("Index", new { homePageSearch = Model.SearchProperties, pageNo = page }), PagedListRenderOptions.OnlyShowFivePagesAtATime)

0 ответов

Другие вопросы по тегам