2014-10-29 63 views
0

我有一個asp.net MVC 5視圖。我有它下面的代碼:如何在asp.net mvc 5中解決這個分頁錯誤?

@model PagedList.IPagedList<parishV3.Models.HeadsViewModel> 
@using PagedList; 
@using PagedList.Mvc; 
<link href="~/Content/css/PagedList.css" rel="stylesheet" /> 

@using (Html.BeginForm("Index", "Heads", FormMethod.Get)) 
{ 
    <p> 
    <b> Find by name:</b>@Html.RadioButton("findBy", "fname") <text>First Name</text> 
    @Html.RadioButton("findBy", "lname")<text>Last Name</text><br /> 
    @Html.RadioButton("findBy", "h_no")<text>Header Number</text><br /> 
    @Html.TextBox("Seach_Data", ViewBag.FilterValue as string, ViewBag.CurrentFilter as string) 
    <input type="submit" value="Find" /> 
</p> 
} 

<br /> 
Page @(Model.PageCount < Model.PageNumber ? 0 : Model.PageNumber) of @Model.PageCount 
@Html.PagedListPager(Model, page => Url.Action("Index", new { page, findby = Request.QueryString["findby"], Seach_Data = Request.QueryString["Seach_Data"] })) 

控制器

public ActionResult Index(string Seach_Data, string findby, int? page, string currentFilter) 
{ 
    if (findby == "fname") 
    { 
     string query = "SELECT v.h_no as h_no, v.h_initials , v.h_id as h_id , t.titles as titles,  p.Suburb as Suburb, p.flatNo as flatNo, p.flatName as flatName,v.Email as Email, v.cell as cell, v.tel_h as tel_h, v.fname as fname, p.strname as strname, p.strNo as strNo, p.City as City, LEFT(v.lname, 255) as lname from [dbo].[Heads] v, [dbo].[Addresses1] p, [dbo].[Titles] t WHERE v.[h_ID] = p.[h_id] and v.[title_id]= t.[title_id] "; 

     var ViewModel = db.Database.SqlQuery<HeadsViewModel>(query); 
     return View(ViewModel.Where(x => x.fname == Seach_Data).ToList().ToPagedList(page ?? 1, 4)); 
    } 
    else if (findby == "lname") 
    { 
     string query = "SELECT v.h_no as h_no, v.h_initials , v.h_id as h_id , t.titles as titles, p.Suburb as Suburb, p.flatNo as flatNo, p.flatName as flatName,v.Email as Email, v.cell as cell, v.tel_h as tel_h, v.fname as fname, p.strname as strname, p.strNo as strNo, p.City as City, LEFT(v.lname, 255) as lname from [dbo].[Heads] v, [dbo].[Addresses1] p, [dbo].[Titles] t WHERE v.[h_ID] = p.[h_id] and v.[title_id]= t.[title_id] "; 
     var ViewModel = db.Database.SqlQuery<HeadsViewModel>(query); 

     return View(ViewModel.Where(x => x.lname == Seach_Data).ToList().ToPagedList(page ?? 1, 6)); 
    } 
    else 
    { 
     string query = "SELECT v.h_no as h_no, v.h_initials , v.h_id as h_id , t.titles as titles, p.Suburb as Suburb, p.flatNo as flatNo, p.flatName as flatName,v.Email as Email, v.cell as cell, v.tel_h as tel_h, v.fname as fname, p.strname as strname, p.strNo as strNo, p.City as City, LEFT(v.lname, 255) as lname from [dbo].[Heads] v, [dbo].[Addresses1] p, [dbo].[Titles] t WHERE v.[h_ID] = p.[h_id] and v.[title_id]= t.[title_id] "; 
     var ViewModel = db.Database.SqlQuery<HeadsViewModel>(query); 
     return View(ViewModel); 
    } 
} 

我的問題是,當我運行該項目它給了我一個錯誤,指出:

系統。 InvalidOperationException:傳入字典的模型項類型爲 System.Data.Entity.Infrastructure.DbRawSqlQuery 1[parishV3.Models.HeadsViewModel], but this dictionary requires a model item of type 'PagedList.IPagedList 1 [parishV3.Models .HeadsViewModel]」。」

+2

檢查您返回的模型類型與視圖中定義的模型相匹配。 – Venkat 2014-10-29 14:02:58

+0

請顯示索引操作的所有代碼,可能您返回的是不正確的模型 – 2014-10-29 14:34:13

+1

控制器中的嵌入式SQL在很多級別上都是錯誤的,這是最差的做法。 – asawyer 2014-10-29 15:21:54

回答

1

在初始頁面負載,以便執行else塊返回DbRawSqlQuery1<parishV3.Models.HeadsViewModel>但是您的視圖需要的模型是IPagedList1<parishV3.Models.HeadsViewModel>findby的值爲空。使用分頁列表時更改您else

else 
{ 
    string query = "....."; 
    var ViewModel = db.Database.SqlQuery<HeadsViewModel>(query); 
    return View(ViewModel.ToList().ToPagedList(1, 6)); 
} 

注意,您的查詢應該包括OrderBy條款,以確保集合總是以相同的順序,否則你可能會得到不可預知的結果返回。

+0

如果你想分頁改變到另一個數字,你必須做到這一點「ToPagedList(page ?? 1,6)」 – ninjaXnado 2014-10-30 10:20:01

+0

當然,但我認爲'else'塊是爲初始頁只加載,在這種情況下,你想要的第一頁,這就是爲什麼我只是做'ToPagedList(1,6)',但如果'findby'在其他情況下可能爲空,最好使用'(page ?? 1,6) '。 – 2014-10-30 10:26:53