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