ASP.Net MVC Строго типизированные представления - PullRequest
1 голос
/ 04 июня 2009

Я создал строго типизированное представление в проекте ASP.Net MVC, над которым я работаю. Это просто индексная страница, которая перечисляет содержимое таблицы SQL в сетке.

Теперь я хочу добавить функциональность для фильтрации этого списка. Я попытался сделать это, создав форму в представлении с выпадающим списком, содержащим значения, по которым вы можете фильтровать. Идея состоит в том, что когда пользователь отправляет эту форму, он запускает метод 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>

Есть идеи, что я делаю неправильно?

Ответы [ 4 ]

5 голосов
/ 04 июня 2009

Ну, в сообщении об ошибке вроде сказано, что вы делаете неправильно.

Представление ожидает, что 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());
1 голос
/ 04 июня 2009

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 to Object.
IQueryable для Linq to SQL и других прав.

0 голосов
/ 04 июня 2009

форма публикует значение, прикрепленное к выпадающему меню, измените параметр метода с FormCollection на int []

0 голосов
/ 04 июня 2009

Подпись для ActionResult ожидает

public ActionResult Index(FormCollection formValues)

Где FormCollection - это тип IEnumerable. Однако, по вашему мнению, вы отправляете обратно выбранный индекс из выпадающего списка, который является Int32:

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

Вы должны изменить подпись ActionResult для принятия int.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...