ASP.Net MVC Stongly Typed Views

Gav*_*vin 1 asp.net-mvc

我在我正在研究的ASP.Net MVC项目中创建了一个强大的类型视图,视图只是一个索引页面,列出了网格中SQL表的内容.

我现在想要添加功能来过滤此列表.我试图通过在视图中创建一个包含可以过滤的值的下拉列表来完成此操作.这个想法是,当用户提交该表单时,它会触发控制器Post索引方法,该方法将从传递给方法的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});
    }
Run Code Online (Sandbox Code Playgroud)

页面在以未过滤的形式加载时显示正常,但是当我单击提交按钮应用过滤器时,我收到以下错误

" 传入字典的模型项的类型为'System.Data.Objects.ObjectQuery 1[System.Int32]' but this dictionary requires a model item of type 'System.Collections.Generic.IEnumerable1 [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>
Run Code Online (Sandbox Code Playgroud)

知道我做错了什么吗?

Tho*_*ock 5

嗯,它有点在错误消息中说你做错了什么.

视图期望IEnumerable1<Tasks>传递给它作为模型,但是你传递了一个new { t, t.Projects}

另外,在你的代码中放一些喘息的空间..

更换

return View(*hard to read code here*);
Run Code Online (Sandbox Code Playgroud)

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