2009-06-04 159 views
1

我在我正在處理的ASP.Net MVC項目中創建了一個非常類型的視圖,視圖只是一個索引頁,它列出了網格中一個SQL表的內容。ASP.Net MVC強類型視圖

我現在要添加功能來過濾此列表。我試圖通過在視圖中創建一個包含您可以過濾的值的下拉列表來創建表單。這個想法是,當用戶提交表單時,它會觸發控制器的Post index方法,該方法將從傳遞給方法的FormCollection中獲取選定值。

例如我的2層指標的方法是這樣的

public ActionResult Index() 
    { 
     DevAdminEntities db = new DevAdminEntities(); 
     ViewData["StatusDropDown"] = new SelectList(db.TaskStatuses, "TaskStatusId", "StatusName"); 
     return View(db.Tasks); 
    } 

    [AcceptVerbs(HttpVerbs.Post)] 
    public ActionResult Index(FormCollection formValues) 
    { 
     DevAdminEntities db = new DevAdminEntities(); 
     ViewData["StatusDropDown"] = new SelectList(db.TaskStatuses, "TaskStatusId", "StatusName"); 
     return View(from t in db.Tasks where t.Projects.ProjectId == int.Parse(Request.Form["StatusDropDown"]) new { t, t.Projects}); 
    } 

頁面加載時在其未過濾的形式,但是當我點擊提交按鈕應用過濾器,我得到以下錯誤顯示細膩

傳遞到詞典中的模型項的類型爲‘System.Data.Objects.ObjectQuery 1[System.Int32]' but this dictionary requires a model item of type 'System.Collections.Generic.IEnumerable 1 [DevAdmin.Models.Tasks]’。

視圖看起來像這樣

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<IEnumerable<DevAdmin.Models.Tasks>>" %>  
<asp:Content ID="Content1" ContentPlaceHolderID="head" runat="server"> 
    <title>Index</title> 
</asp:Content>  
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">  
    <h2>Tasks</h2>   
    <%= Html.ValidationSummary() %> 
    <% using (Html.BeginForm()) {%> 
     <fieldset> 
      <legend>Filters</legend>   
      <p> 
       <%= Html.DropDownList("StatusDropDown") %> 
       <input type="submit" value="Filter" /> 
      </p>      
     </fieldset> 
    <% } %>    
    <table> 
     <tr> 
      <th></th> 
      <th> 
       TaskId 
      </th> 
      <th> 
       Subject 
      </th> 
      <th> 
       Description 
      </th> 
     </tr>  
    <% foreach (var item in Model) { %>   
     <tr> 
      <td> 
       <%= Html.ActionLink("Edit", "Edit", new { id=item.TaskId }) %> | 
       <%= Html.ActionLink("Details", "Details", new { id = item.TaskId })%> 
      </td> 
      <td> 
       <%= Html.Encode(item.TaskId) %> 
      </td> 
      <td> 
       <%= Html.Encode(item.Subject) %> 
      </td> 
      <td> 
       <%= Html.Encode(item.Description) %> 
      </td> 
     </tr>   
    <% } %>  
    </table>  
    <p> 
     <%= Html.ActionLink("Create New", "Create") %> 
    </p>  
</asp:Content> 

任何想法我做錯了什麼?

+1

還有一個提示:通常最好將過濾器設置爲「GET」方法而不是「POST」。這樣人們可以爲他們的過濾器添加書籤,並且可以創建指向特定過濾器的鏈接過濾器是一種不會改變資源中的任何內容的操作,因此它應該是「GET」。 – Gidon 2009-06-04 08:08:52

回答

5

那麼,它有點在錯誤消息中說你做錯了什麼。

的觀點希望傳遞給它的型號爲一個IEnumerable1<Tasks>,但你傳遞一個new { t, t.Projects}

另外,把一些喘息的空間,在你的代碼..

更換

return View(*hard to read code here*); 

int currentStatus = int.Parse(Request.Form["StatusDropDown"]; 
var tasks = db.Tasks.Where(t => t.ProjectId.Equals(currentStatus)); 
return View("Index", tasks.AsEnumerable()); 
0

Action的簽名結果期望

public ActionResult Index(FormCollection formValues) 

其中FormCollection I是IEnumerable類型。然而,在你看來,你是從降回發所選擇的指數下降,這是一個Int32

<%= Html.DropDownList("StatusDropDown") %> 
<input type="submit" value="Filter" /> 

你應該改變的ActionResult簽名接受int

0

形式發佈附連到下拉的值,則該方法從參數變化的FormCollection爲int []

1

1)return View(db.Tasks);返回一個IEnumerable

2)return View(from t in db.Tasks where t.Projects.ProjectId == int.Parse(Request.Form["StatusDropDown"]) new { t, t.Projects});返回一個IQueryable。

所以你必須選擇: 要麼改變1)到return View(db.Tasks).AsQueryable(),並在你的看法改變類型爲IQueryable。

或更改2)代入return View(from t in db.Tasks where t.Projects.ProjectId == int.Parse(Request.Form["StatusDropDown"]) new { t, t.Projects}).AsEnumerable();

IEnumerable的是用於LINQ到對象。
IQueryable適用於Linq to SQL和其他實體。