Разбиение на страницы отфильтрованных данных, которые теряются при нажатии на вторую страницу веб-сетки
Я создал WebGrid
в веб-приложении MVC3. В моем приложении сортировка, фильтрация и подкачка включены.
Проблема: всякий раз, когда выполняется фильтрация webgrid
, он заполняет отфильтрованные данные в Webgrid
, Но если я нажму на вторую страницу, чтобы увидеть оставшиеся данные, отфильтрованные Webgrid
в моем искомом тексте он не показывает оставшиеся отфильтрованные данные, а показывает полный список всех элементов в сетке.
Как я могу получить данные на второй странице после фильтрации моих данных в сетке.
Я видел подобный вопрос на сайте, даже он не решил мою проблему.
Мое представление: я создал частичное представление для заполнения сетки, которое вызывается обычным представлением. Я следовал этому руководству, чтобы сделать это.
Контроллер: впервые, Webgrid
загружает данные, используя другой метод в модели, чтобы заполнить все данные из базы данных
Код моего частичного просмотра:
@{
ViewBag.Title = "listStudents";
Layout = "~/Views/Shared/_Layout.cshtml";
WebGrid grid = new WebGrid(Model, canPage: true, canSort: true, rowsPerPage: 3);
}
@grid.Pager(WebGridPagerModes.NextPrevious)
@grid.GetHtml( //Error at this line
htmlAttributes: new { id = "grdListStudents" },
fillEmptyRows: true,
headerStyle: "tblHeader",
tableStyle: "tablestyle",
mode: WebGridPagerModes.All,
firstText: "<< First",
previousText: "< Previous", nextText: "Next >",
lastText: "Last >>",
columns: new[]{
grid.Column("intID","SId",canSort:true),
grid.Column("strFirstName","Name",canSort:true,format:(item)=>item.strFirstName+" "+item.strLastName),
grid.Column("strPhone","Phone",canSort:true),
grid.Column("strEmail","Email",canSort:true),
}
)
Вот мой код в контроллере:
только для чтения IStudentInfo _istudentrepository;
public studentController( IStudentInfo _iStudentRepository)
{
this._istudentrepository = _iStudentRepository;
}
//To filter according to Searched Text
[HttpPost]
public ActionResult studentController(string txtSearch,string ddlTitle,FormCollection collect)
{
IEnumerable<Students> sList;
sList = _istudentlistrepository.getAllStudentsList();
if (txtSearch != "")
{
switch (ddlTitle)
{
case "intId":
int sId = Convert.ToInt32(txtSearch);
sList = sList.Where(b => b.intId == sId).ToList();
break;
case "strFirstName":
sList = sList.Where(b => b.strFirstName.ToLower().Contains(txtSearch.ToLower())).ToList();
break;
case "strPhone":
sList = sList.Where(b => b.strPhone.ToLower().Contains(txtSearch.ToLower())).ToList();
break;
case "strEmail":
sList = sList.Where(b => b.strEmail.ToLower().Contains(txtSearch.ToLower())).ToList();
break;
}
}
return PartialView("_grdListStudents", sList);
}
public ActionResult studentController(string sort, string sortdir, int? page)
{
int startPage = 0;
IEnumerable<Students> sList;
if (page.HasValue && page.Value > 0)
{
startPage = page.Value;
}
sList = _istudentrepository.GetList(startPage, PageSize, sort, sortdir);
return View(sList);
}
Код в интерфейсе IStudentInfo:
public interface IStudentInfo
{
IEnumerable<Students> GetList(int intPage, int intRecords, string strSort, string sortdir);
}
Код в модели:
private MyEntity _entity;
public StudentListRepository(MyEntity Ent)
{
this._entity = Ent;
}
public IEnumerable<Students> GetList(int intPage, int intRecords, string strSort, string sortdir)
{
var finalresult = new Students();
var bidList = (from userInfo in _entity.tbl_UserInf
join user in _entity.tbl_User on userInfo.UserId equals user.UserId
select new Students()
{
intID=user.UserId,
strFirstName = user.FirstName,
strEmail = userInfo.EmailId,
intPhone=userInfo.Phone
}).OrderByDescending(m => m.intID);
finalresult.TotalResult = bidList.Count();
switch (strSort)
{
case "intID":
if (sortdir == "ASC")
{
sList = sList.OrderBy(r => r.Id);
}
else
{
sList= sList.OrderByDescending(r => r.Id);
}
break;
case "strFirstName":
if (sortdir == "ASC")
{
sList = sList.OrderBy(r => r.strFirstName);
}
else
{
sList= sList.OrderByDescending(r => r.strFirstName);
}
break;
case "strEmail":
if (sortdir == "ASC")
{
sList = sList.OrderBy(r => r.strEmail);
}
else
{
sList= sList.OrderByDescending(r => r.strEmail);
}
break;
//repeat same for phone
}
finalresult.lstStudents = sList.Skip(intPage * intRecords).Take(intRecords).ToList();
return sList.ToArray();
}
1 ответ
Ваша модель представления должна содержать список элементов и значения для текста поиска, размера страницы, текущей страницы и общего количества записей. Я использую базовый базовый класс со следующими свойствами:
public class PagedViewModel<T> {
public IList<T> Items { get; set; }
public int PageSize { get; set; }
public int RowCount { get; set; }
public int Page { get; set; }
public int PageCount { get; set; }
public string sort { get; set; }
public string sortdir { get; set; }
}
Тогда ваш конкретный Viewmodel выглядит так:
public class StudentsListViewModel : PagedViewModel<Students> {
public string Search { get; set; }
}
Из ваших комментариев, которые я прочитал, вы хотите Ajax.BeginForm
обновить свою сетку через ajax. Затем вам нужно два действия: одно для всей страницы и одно для сетки (частичное).
Первое действие возвращает всю страницу:
public ActionResult Index() {
StudentsListViewModel model = queryStudents(1, 10, null);
return View(model);
}
Второе действие возвращает частичное представление для сетки:
public ActionResult UpdateStudentsGrid(StudentsListViewModel model) {
model.Items = queryStudents(model);
return Partial("StudentsGrid", model);
}
Вспомогательный метод запрашивает данные и возвращает отфильтрованный список:
private StudentsListViewModel queryStudents(int page, int rowsPerPage,
string search) {
StudentsListViewModel = new StudentsListViewModel {
Page = page,
PageSize = rowsPerPage,
Items = db.Students.Where(s => s.Name == search || search == null)
... add paging...;
};
// ToDo: set additional properties on model
return model;
}
Основной вид страницы содержит вашу форму ajax. Список будет представлен частичным представлением:
@model StudentsViewModel
@using (Ajax.BeginForm("UpdateStudentsGrid",
new AjaxOptions { UpdateTargetId = "grid" })) {
@Html.TextboxFor(m => m.Search)
<input type=submit" />
<div id="grid">
@Html.Partial("StudentsGrid", Model);
</div>
}
Частичное представление выглядит примерно так и отображает только сетку:
@{
var grid = new WebGrid(Model.Items, canPage: true, canSort: true,
rowsPerPage: Model.PageSize);
}
@grid.GetHtml(...)
Я не тестировал и не компилировал код: он, вероятно, не будет работать так, как он есть, но он должен помочь вам начать работу.
РЕДАКТИРОВАТЬ: забытый пейджер
Чтобы ссылки на пейджеры работали с вашей формой, вы можете просто изменить метод формы с POST на GET в соответствии с этой статьей: http://www.mikepope.com/blog/DisplayBlog.aspx?permalink=2377
Но я не уверен, как это работает с формой AJAX.
Другой подход заключается в перехвате кликов по ссылкам на пейджер и отправке формы методом POST: http://forums.asp.net/t/1703486.aspx/1