Предыстория вопроса:
Я использую 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)
new { pageNo = page, someProperty = someValue, anotherProperty = anotherValue, etc }
- person   schedule 09.12.2015Ajax.BeginForm()
). См. этот ответ для типичного примера - person   schedule 10.12.2015homePageSearch = 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