ASP.NET MVC 3 PagedList。该方法“跳过”仅支持在LINQ到实体排序的输入。 [英] ASP.NET MVC 3 PagedList. The method 'Skip' is only supported for sorted input in LINQ to Entities.
问题描述
为什么提示错误在返回查看(contacts.ToPagedList(PAGENUMBER,pageSize的));
语句在索引方法的错误:的方法跳过仅支持在LINQ到实体排序的输入。该方法排序依据必须在方法'跳过'之前被调用。
使用系统;
使用System.Collections.Generic;
使用System.Data这;
使用System.Data.Entity的;
使用System.Linq的;
使用的System.Web;
使用System.Web.Mvc;
使用PhoneBook.Models;
使用PagedList;命名空间PhoneBook.Controllers
{
公共类ContactsController:控制器
{
私人PhoneDBContext DB =新PhoneDBContext(); //
// GET:/联系人/ 公众的ViewResult指数(字符串搜索字符串,字符串中将sortOrder,接触模型,串currentFilter,诠释?页)
{
ViewBag.CurrentSort =中将sortOrder; ViewBag.FNameSortParm =中将sortOrder ==FName参数ASC? FName参数说明:FName参数ASC;
ViewBag.DateSortParm =中将sortOrder ==日期递增? 日期递减:日期递增
ViewBag.LNameSortParm =中将sortOrder ==LName的ASC? LName的说明:LName的ASC;
ViewBag.CompSortParm =中将sortOrder ==公司ASC? 公司说明:公司ASC;
ViewBag.MobSortParm =中将sortOrder ==暴民ASC? 暴民说明:暴民ASC;
ViewBag.TelSortParm =中将sortOrder ==电话ASC? 电话说明:电话ASC; 如果(Request.HttpMethod ==GET){搜索字符串= currentFilter; }
其他{页面= 1;}
ViewBag.CurrentFilter =搜索字符串;
VAR接触=从米db.Contacts
选择米; 开关(中将sortOrder)
{
案FName参数说明:
接触= contacts.OrderByDescending(S = GT; s.FirstName);
打破;
案FName参数ASC:
接触= contacts.OrderBy(S = GT; s.FirstName);
打破;
案LName的说明:
接触= contacts.OrderByDescending(S = GT; s.LastName);
打破;
案LName的ASC:
接触= contacts.OrderBy(S = GT; s.LastName);
打破;
案公司说明:
接触= contacts.OrderByDescending(S = GT; s.Company);
打破;
案公司ASC:
接触= contacts.OrderBy(S = GT; s.Company);
打破;
案日期递减:
接触= contacts.OrderByDescending(S = GT; s.DateAdded);
打破;
案日期递增:
接触= contacts.OrderBy(S = GT; s.DateAdded);
打破;
案暴民说明:
接触= contacts.OrderByDescending(S = GT; s.MobileNumber);
打破;
案暴民ASC:
接触= contacts.OrderBy(S = GT; s.MobileNumber);
打破;
案电话说明:
接触= contacts.OrderByDescending(S = GT; s.TelephoneNumber);
打破;
案电话ASC:
接触= contacts.OrderBy(S = GT; s.TelephoneNumber);
打破;
}
如果(!String.IsNullOrEmpty(搜索字符串))
{
接触= contacts.Where(S = GT; s.LastName.ToUpper().Contains(searchString)||s.FirstName.ToUpper().Contains(searchString)||s.Company.ToUpper().Contains(searchString));
} INT的pageSize = 3;
INT PAGENUMBER =(第53页1); 返回查看(contacts.ToPagedList(PAGENUMBER,pageSize的));
} //
// GET:/联系人/详细资料/ 5 公众的ViewResult详细信息(INT ID)
{
联系方式联系方式= db.Contacts.Find(ID);
返回查看(接触);
} //
// GET:/联系人/创建 公众的ActionResult的Create()
{
返回查看();
} //
// POST:/联系人/创建 [HttpPost]
公众的ActionResult创建(联系方式联系方式)
{
如果(ModelState.IsValid)
{
db.Contacts.Add(接触);
contact.DateAdded = DateTime.Now;
db.SaveChanges();
返回RedirectToAction(「指数」);
} 返回查看(接触);
} //
// GET:/联系人/编辑/ 5 公众的ActionResult编辑(INT ID = 0)
{ 联系方式联系方式= db.Contacts.Find(ID); 如果(接触== NULL){返回HttpNotFound(); } //返回空白页,如果ID无效
返回查看(接触);
} //
// POST:/联系人/编辑/ 5 [HttpPost]
公众的ActionResult编辑(联系方式联系方式)
{
如果(ModelState.IsValid)
{
db.Entry(接触).STATE = EntityState.Modified;
contact.DateAdded = DateTime.Now;
db.SaveChanges();
返回RedirectToAction(「指数」);
}
返回查看(接触);
} //
// GET:/联系人/删除/ 5 公众的ActionResult删除(INT ID)
{
联系方式联系方式= db.Contacts.Find(ID);
如果(接触== NULL){返回HttpNotFound(); }
返回查看(接触);
} //
// POST:/联系人/删除/ 5 [HttpPost,ActionName(删除)]
公众的ActionResult DeleteConfirmed(INT ID)
{
联系方式联系方式= db.Contacts.Find(ID);
如果(接触== NULL){返回HttpNotFound(); }
db.Contacts.Remove(接触);
db.SaveChanges();
返回RedirectToAction(「指数」);
} 公众的ActionResult SearchIndex(字符串搜索字符串)
{
VAR接触=从米db.Contacts
选择米; 如果(!String.IsNullOrEmpty(搜索字符串))
{
接触= contacts.Where(S = GT; s.LastName.Contains(搜索字符串));
} 返回查看(联系人);
} 保护覆盖无效的Dispose(BOOL处置)
{
db.Dispose();
base.Dispose(处置);
}
}
}
下面是Index.cshtml code:
@model PagedList.IPagedList< PhoneBook.Models.Contact>
@ {
ViewBag.Title =电话簿
}&所述p为H.; @using(Html.BeginForm()){
&所述p为H.;搜索:@ Html.TextBox(SearchString在ViewBag.CurrentFilter为字符串)
<输入类型=提交值=转到/>< / P>
}
&所述; / P>
&所述p为H.;
@ Html.ActionLink(新建,创建)
&所述; / P><表>
&所述; TR>
<第i个
@ Html.ActionLink(名,索引,新的{中将sortOrder = ViewBag.FNameSortParm,currentFilter = ViewBag.CurrentFilter})
< /第i
<第i个
@ Html.ActionLink(姓,索引,新的{中将sortOrder = ViewBag.LNameSortParm,currentFilter = ViewBag.CurrentFilter})
< /第i
<第i个
@ Html.ActionLink(移动民,索引,新的{中将sortOrder = ViewBag.MobSortParm,currentFilter = ViewBag.CurrentFilter})
< /第i
<第i个
@ Html.ActionLink(电话民,索引,新的{中将sortOrder = ViewBag.TelSortParm,currentFilter = ViewBag.CurrentFilter})
< /第i
<第i个
@ Html.ActionLink(本公司,索引,新的{中将sortOrder = ViewBag.CompSortParm,currentFilter = ViewBag.CurrentFilter})
< /第i
<第i个
@ Html.ActionLink(上架日期/更新,索引,新的{中将sortOrder = ViewBag.DateSortParm,currentFilter = ViewBag.CurrentFilter})
< /第i
百分位>< /第i
< / TR>@foreach(以型号VAR项){
&所述; TR>
&所述; TD>
@ Html.DisplayFor(modelItem => item.FirstName)
< / TD>
&所述; TD>
@ Html.DisplayFor(modelItem => item.LastName)
< / TD>
&所述; TD>
@ Html.DisplayFor(modelItem => item.MobileNumber)
< / TD>
&所述; TD>
@ Html.DisplayFor(modelItem => item.TelephoneNumber)
< / TD>
&所述; TD>
@ Html.DisplayFor(modelItem => item.Company)
< / TD>
&所述; TD>
@ Html.DisplayFor(modelItem => item.DateAdded)
< / TD>
&所述; TD>
@ Html.ActionLink(详细信息,详细信息,新{ID = item.ID})
@ Html.ActionLink(编辑,编辑,新{ID = item.ID})
@ Html.ActionLink(删除,删除,新{ID = item.ID})
< / TD>
< / TR>
}< /表>< DIV>
页@(Model.PageCount< Model.PageNumber 0:Model.PageNumber)
动@ Model.PageCount @if(Model.Has previousPage)
{
@ Html.ActionLink(<<,索引,新页面{= 1,中将sortOrder = ViewBag.CurrentSort,currentFilter = ViewBag.CurrentFilter})
@ Html.Raw();
@ Html.ActionLink(其中p preV,索引,新的{页= Model.PageNumber - 1,中将sortOrder = ViewBag.CurrentSort,currentFilter = ViewBag.CurrentFilter})
}
其他
{
@:其中;&下;
@ Html.Raw();
@:或其可preV
} @if(Model.HasNextPage)
{
@ Html.ActionLink(下一步>中,索引,新的{页= Model.PageNumber + 1 =中将sortOrder ViewBag.CurrentSort,currentFilter = ViewBag.CurrentFilter})
@ Html.Raw();
@ Html.ActionLink(>>中,索引,新的{页= Model.PageCount,中将sortOrder = ViewBag.CurrentSort,currentFilter = ViewBag.CurrentFilter})
}
其他
{
@:下一个>
@ Html.Raw()
@:>>
}
< / DIV>
请尝试以下三个转变。
-
将这个code的前的switch语句:
如果(!String.IsNullOrEmpty(搜索字符串))
{
接触= contacts.Where(S = GT; s.LastName.ToUpper().Contains(searchString)||s.FirstName.ToUpper().Contains(searchString)||s.Company.ToUpper().Contains(searchString));
} -
在您的switch语句添加
默认
的情况下,并使其抛出。开关(中将sortOrder){
案件 ...:
...
默认:
抛出新的ArgumentException(中将sortOrder坏指定排序顺序);
} -
使用类型
IOrderedQueryable< T>
IOrderedQueryable< T> orderedContacts;
开关(中将sortOrder)
{
案FName参数说明:
orderedContacts = contacts.OrderByDescending(S => s.FirstName);
打破;
...
}...返回查看(orderedContacts.ToPagedList(PAGENUMBER,pageSize的));
Why is it it gives error in return View(contacts.ToPagedList(pageNumber, pageSize));
statement the error in the Index method :
The method 'Skip' is only supported for sorted input in LINQ to Entities. The method 'OrderBy' must be called before the method 'Skip'.
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Entity;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using PhoneBook.Models;
using PagedList;
namespace PhoneBook.Controllers
{
public class ContactsController : Controller
{
private PhoneDBContext db = new PhoneDBContext();
//
// GET: /Contacts/
public ViewResult Index(string searchString, string sortOrder, Contact model, string currentFilter, int? page)
{
ViewBag.CurrentSort = sortOrder;
ViewBag.FNameSortParm = sortOrder == "FName asc"? "FName desc" : "FName asc";
ViewBag.DateSortParm = sortOrder == "Date asc" ? "Date desc" : "Date asc";
ViewBag.LNameSortParm = sortOrder == "LName asc" ? "LName desc" : "LName asc";
ViewBag.CompSortParm = sortOrder == "Company asc" ? "Company desc" : "Company asc";
ViewBag.MobSortParm = sortOrder == "Mob asc" ? "Mob desc" : "Mob asc";
ViewBag.TelSortParm = sortOrder == "Tel asc" ? "Tel desc" : "Tel asc";
if (Request.HttpMethod == "GET") { searchString = currentFilter; }
else {page = 1;}
ViewBag.CurrentFilter = searchString;
var contacts = from m in db.Contacts
select m;
switch (sortOrder)
{
case "FName desc":
contacts = contacts.OrderByDescending(s => s.FirstName);
break;
case "FName asc":
contacts = contacts.OrderBy(s => s.FirstName);
break;
case "LName desc":
contacts = contacts.OrderByDescending(s => s.LastName);
break;
case "LName asc":
contacts = contacts.OrderBy(s => s.LastName);
break;
case "Company desc":
contacts = contacts.OrderByDescending(s => s.Company);
break;
case "Company asc":
contacts = contacts.OrderBy(s => s.Company);
break;
case "Date desc":
contacts = contacts.OrderByDescending(s => s.DateAdded);
break;
case "Date asc":
contacts = contacts.OrderBy(s => s.DateAdded);
break;
case "Mob desc":
contacts = contacts.OrderByDescending(s => s.MobileNumber);
break;
case "Mob asc":
contacts = contacts.OrderBy(s => s.MobileNumber);
break;
case "Tel desc":
contacts = contacts.OrderByDescending(s => s.TelephoneNumber);
break;
case "Tel asc":
contacts = contacts.OrderBy(s => s.TelephoneNumber);
break;
}
if (!String.IsNullOrEmpty(searchString))
{
contacts = contacts.Where(s => s.LastName.ToUpper().Contains(searchString)||s.FirstName.ToUpper().Contains(searchString)||s.Company.ToUpper().Contains(searchString));
}
int pageSize = 3;
int pageNumber = (page ?? 1);
return View(contacts.ToPagedList(pageNumber, pageSize));
}
//
// GET: /Contacts/Details/5
public ViewResult Details(int id)
{
Contact contact = db.Contacts.Find(id);
return View(contact);
}
//
// GET: /Contacts/Create
public ActionResult Create()
{
return View();
}
//
// POST: /Contacts/Create
[HttpPost]
public ActionResult Create(Contact contact)
{
if (ModelState.IsValid)
{
db.Contacts.Add(contact);
contact.DateAdded = DateTime.Now;
db.SaveChanges();
return RedirectToAction("Index");
}
return View(contact);
}
//
// GET: /Contacts/Edit/5
public ActionResult Edit(int id=0)
{
Contact contact = db.Contacts.Find(id);
if (contact == null) { return HttpNotFound(); } // returns blank page if id is not valid
return View(contact);
}
//
// POST: /Contacts/Edit/5
[HttpPost]
public ActionResult Edit(Contact contact)
{
if (ModelState.IsValid)
{
db.Entry(contact).State = EntityState.Modified;
contact.DateAdded = DateTime.Now;
db.SaveChanges();
return RedirectToAction("Index");
}
return View(contact);
}
//
// GET: /Contacts/Delete/5
public ActionResult Delete(int id)
{
Contact contact = db.Contacts.Find(id);
if (contact == null) { return HttpNotFound(); }
return View(contact);
}
//
// POST: /Contacts/Delete/5
[HttpPost, ActionName("Delete")]
public ActionResult DeleteConfirmed(int id)
{
Contact contact = db.Contacts.Find(id);
if (contact == null) { return HttpNotFound(); }
db.Contacts.Remove(contact);
db.SaveChanges();
return RedirectToAction("Index");
}
public ActionResult SearchIndex(string searchString)
{
var contacts = from m in db.Contacts
select m;
if (!String.IsNullOrEmpty(searchString))
{
contacts = contacts.Where(s => s.LastName.Contains(searchString));
}
return View(contacts);
}
protected override void Dispose(bool disposing)
{
db.Dispose();
base.Dispose(disposing);
}
}
}
below is the Index.cshtml code:
@model PagedList.IPagedList<PhoneBook.Models.Contact>
@{
ViewBag.Title = "Phone Book";
}
<p>
@using (Html.BeginForm()){
<p> Search: @Html.TextBox("SearchString", ViewBag.CurrentFilter as string)
<input type="submit" value="Go" /></p>
}
</p>
<p>
@Html.ActionLink("Create New", "Create")
</p>
<table>
<tr>
<th>
@Html.ActionLink("First Name", "Index", new { sortOrder=ViewBag.FNameSortParm, currentFilter=ViewBag.CurrentFilter })
</th>
<th>
@Html.ActionLink("Last Name", "Index", new { sortOrder = ViewBag.LNameSortParm, currentFilter = ViewBag.CurrentFilter })
</th>
<th>
@Html.ActionLink("Mobile Num", "Index", new { sortOrder = ViewBag.MobSortParm, currentFilter = ViewBag.CurrentFilter })
</th>
<th>
@Html.ActionLink("Tel Num", "Index", new { sortOrder = ViewBag.TelSortParm, currentFilter = ViewBag.CurrentFilter })
</th>
<th>
@Html.ActionLink("Company", "Index", new { sortOrder = ViewBag.CompSortParm, currentFilter = ViewBag.CurrentFilter })
</th>
<th>
@Html.ActionLink("Date Added/Updated", "Index", new { sortOrder = ViewBag.DateSortParm, currentFilter = ViewBag.CurrentFilter })
</th>
<th></th>
</tr>
@foreach (var item in Model) {
<tr>
<td>
@Html.DisplayFor(modelItem => item.FirstName)
</td>
<td>
@Html.DisplayFor(modelItem => item.LastName)
</td>
<td>
@Html.DisplayFor(modelItem => item.MobileNumber)
</td>
<td>
@Html.DisplayFor(modelItem => item.TelephoneNumber)
</td>
<td>
@Html.DisplayFor(modelItem => item.Company)
</td>
<td>
@Html.DisplayFor(modelItem => item.DateAdded)
</td>
<td>
@Html.ActionLink("Details", "Details", new { id=item.ID })
@Html.ActionLink("Edit", "Edit", new { id=item.ID })
@Html.ActionLink("Delete", "Delete", new { id=item.ID })
</td>
</tr>
}
</table>
<div>
Page @(Model.PageCount < Model.PageNumber ? 0 : Model.PageNumber)
of @Model.PageCount
@if (Model.HasPreviousPage)
{
@Html.ActionLink("<<", "Index", new { page = 1, sortOrder = ViewBag.CurrentSort, currentFilter=ViewBag.CurrentFilter })
@Html.Raw(" ");
@Html.ActionLink("< Prev", "Index", new { page = Model.PageNumber - 1, sortOrder = ViewBag.CurrentSort, currentFilter=ViewBag.CurrentFilter })
}
else
{
@:<<
@Html.Raw(" ");
@:< Prev
}
@if (Model.HasNextPage)
{
@Html.ActionLink("Next >", "Index", new { page = Model.PageNumber + 1, sortOrder = ViewBag.CurrentSort, currentFilter=ViewBag.CurrentFilter })
@Html.Raw(" ");
@Html.ActionLink(">>", "Index", new { page = Model.PageCount, sortOrder = ViewBag.CurrentSort, currentFilter=ViewBag.CurrentFilter })
}
else
{
@:Next >
@Html.Raw(" ")
@:>>
}
</div>
Try the following three changes.
Put this code before the switch statement:
if (!String.IsNullOrEmpty(searchString)) { contacts = contacts.Where(s => s.LastName.ToUpper().Contains(searchString)||s.FirstName.ToUpper().Contains(searchString)||s.Company.ToUpper().Contains(searchString)); }
Add a
default
case in your switch statement, and make it throw.switch (sortOrder) { case ...: ... default: throw new ArgumentException("Bad sort order specified", "sortOrder"); }
Use the type
IOrderedQueryable<T>
.IOrderedQueryable<T> orderedContacts; switch (sortOrder) { case "FName desc": orderedContacts = contacts.OrderByDescending(s => s.FirstName); break; ... } ... return View(orderedContacts.ToPagedList(pageNumber, pageSize));
这篇关于ASP.NET MVC 3 PagedList。该方法“跳过”仅支持在LINQ到实体排序的输入。的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!