Как предотвратить потерю объектов между вызовами 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; }
}

Домашняя страницаЭлементы отображения:

  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);
    }

Индекс.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)

person user1352057    schedule 09.12.2015    source источник
comment
Вам нужно отправить значения в качестве параметров маршрута - new { pageNo = page, someProperty = someValue, anotherProperty = anotherValue, etc }   -  person    schedule 09.12.2015
comment
@StephenMuecke Спасибо за ответ. Нужно ли мне передавать переменные фильтра с моделью в мое представление, которые затем можно установить в параметры маршрута?   -  person user1352057    schedule 10.12.2015
comment
Да, но немного сложно понять, что вы делаете со своим кодом (имея 2 отдельных представления и модели и использование Ajax.BeginForm()). См. этот ответ для типичного примера   -  person    schedule 10.12.2015
comment
@StephenMuecke Еще раз спасибо за ваше время и ответ. Я проверил ваш ответ, и он помог мне продвинуться вперед, но у меня все еще возникают проблемы с нулевым значением при повторной отправке объекта HomePageVM обратно в метод Action. Пожалуйста, смотрите мой РЕДАКТИРОВАТЬ в исходном вопросе.   -  person user1352057    schedule 10.12.2015
comment
homePageSearch = Model.SearchProperties не будет работать (посмотрите на атрибут href, который вы создаете, чтобы понять). Я все еще не думаю, что вы используете лучший подход, но вы могли бы заставить его работать, используя new { searchTerm = Model.SearchProperties.searchTerm, searchCatagory = Model.SearchProperties.searchTerm, .... } и изменив метод на public ActionResult Index(HomePageSearchVM homePageSearch, int pageNo = 1), но я полностью запутался, потому что в вашем представлении есть @model HomepageDisplayItems, и вы не показали эту модель.   -  person    schedule 10.12.2015
comment
@StephenMuecke Я добавил HomepageDisplayItems. Спасибо за ваш совет еще раз   -  person user1352057    schedule 10.12.2015
comment
@StephenMuecke В конце концов мне удалось отсортировать это решение, упростив мою виртуальную машину и используя предложенный вами метод отдельной передачи назначенных переменных, которые затем сопоставлялись с моделью на моем контроллере. Если вы можете сделать это своим ответом, я установлю его как правильный.   -  person user1352057    schedule 12.12.2015
comment
Нет смысла повторять код - пометили его как обман.   -  person    schedule 13.12.2015