PagedList в asp.net mvc 3 ничего не возвращает ни на одну страницу после 1

Я использую выгружаемый список в результатах поиска для вывода моих результатов. Он возвращает события в пределах диапазона дат или категории. Первая возвращенная страница в порядке, но вторая никогда не дает никаких результатов. Есть более 7 результатов, которые возвращает запрос, когда я проверяю точку останова. Вот мой контроллер поиска;

   public ActionResult Search(DateTime? q, DateTime? e, int? EventCategoryId, Event model)
    {
        var SearchEvents = db.Events
            .OrderByDescending(r => r.start)
            .Where(r => 
                r.start >= q && 
                r.end <= e && 
                r.EventCategoryId == EventCategoryId || 
                r.start >= q || 
                r.EventCategoryId == EventCategoryId);

        ViewBag.QValue = model.start;

        ViewBag.EValue = model.end;

        ViewBag.ListValue = model.EventCategoryId;

        ViewBag.EventCategoryId = new SelectList(db.EventsCategories, "Id", "Name", ViewBag.ListValue);

        var pageIndex = model.Page ?? 1;
        var results = SearchEvents.ToPagedList(pageIndex, 4);
        ViewBag.Names = results;

        return View(results);
        }
    }

А вот мой взгляд;

@model IPagedList<RealKaac.Models.Event>

@{
    ViewBag.Title = "SearchResults";
}

@using PagedList;
@using PagedList.Mvc;
@using System.Linq;

<div id="Content">
    <h2>SearchResults</h2>
    <div id="EventSearch">
    @using (Html.BeginForm("Search", "Event"))
    {
        <p class="EventPar">Start Date: </p>
        <input id ="datepicker" type ="text" name ="q" value="@ViewBag.QValue" />
            <p class="EventPar">End Date: </p>
        <input id ="datepickerend" type ="text" name ="e" value ="@ViewBag.EValue"  />
        <p class="EventPar">Category:</p>
        @Html.DropDownList("EventCategoryId")
        <input id="EventButton" style="padding:1px;" type ="submit" name ="Search" value = "Search" />
    }
    </div>

    <div id="IndexEvents">
    @foreach (var item in Model)
    {
        <div class ="event">   
            <div class="eventname">
                @*<p>@Html.DisplayFor(modelItem => item.Name)</p>    *@
            </div>
            <div class = "etitle">
                 <p>@Html.DisplayFor(modelItem => item.title)</p>
            </div>
            <div class="eventsdesc">
                <p>@Html.DisplayFor(modelItem => item.EventDescription)</p>
            </div>
            <ul class ="datelink">
                <li style="margin-right:120px;">This event starts on the
                    @Html.DisplayFor(modelItem => item.start) and ends on the
                    @Html.DisplayFor(modelItem => item.end)</li>
                <li>Click @Html.DisplayFor(modelItem => item.EventWebsite) for more info.</li>
            </ul>
        </div>
    }
    </div>
</div>

@Html.PagedListPager((IPagedList)ViewBag.Names, page => Url.Action("Search", new { page }))

Я новичок в этом, поэтому я, вероятно, упускаю что-то маленькое, любые советы очень ценятся.

Спасибо.


person Dan    schedule 28.11.2011    source источник


Ответы (1)


Url.Action имеет только один параметр (номер страницы), который не соответствует методу контроллера. Он не предоставляет доступ к каким-либо другим параметрам (например, датам начала/окончания). Таким образом, второй запрос «страницы» для следующих 4 событий, вероятно, не работает. Если вы создали SearchModel с необходимыми свойствами, вы легко сможете отправлять значения с одной страницы на другую.

public ActionResult Search(SearchModel search) { 
    //... (your search code)
    // ... then, before returning the View,
    ViewBag.SearchParameters = search;
    return View(results);

где SearchModel имеет свойства, например:

public class SearchModel {
   public DateTime? StartDate { get; set; }
   public DateTime? EndDate { get; set; }
   public int Page? { get; set; }
   // etc.
}

Тогда вы могли бы:

 @Html.PagedListPager((IPagedList)ViewBag.Names, page => Url.Action("Search", new SearchModel { search = ViewBag.SearchParameters }))

Или вы можете просто использовать именованные параметры:

@Html.PagedListPager((IPagedList)ViewBag.Names, page => Url.Action("Search", new { page = page, q = ViewBag.QValue, /* ... etc. */ }))
person WiredPrairie    schedule 28.11.2011
comment
Спасибо, это исправлено! Почитав сегодня вечером, я понял, что модели представления должны быть созданы для всего. Ты живи и учись! - person Dan; 29.11.2011