MVC: элемент модели, передаваемый в словарь, относится к типу X, но для этого словаря требуется элемент модели типа X - PullRequest
3 голосов
/ 22 февраля 2012

Сначала я использую модель EF и использую модели представления в MVC, у меня проблемы с этой ошибкой:

The model item passed into the dictionary is of type 'System.Collections.Generic.List`1[NKI3.Models.Question]', but this dictionary requires a model item of type 'System.Collections.Generic.IEnumerable`1[NKI3.ViewModels.IndexCreateViewModel]'.

Это моя модель представления:

public class IndexCreateViewModel
{
    public string QuestionText { get; set; }
    public string Sname { get; set; }
    public string Cname {get;set;}
}

Это мое действие вмой контроллер:

public ActionResult Index()
{
    var Q = db.Question.Include(a => a.SubjectType).Include(a => a.CoreValue);
    return View(Q.ToList());   
}

Вот мой строго типизированный вид:

@model IEnumerable<NKI3.ViewModels.IndexCreateViewModel>

<h2>Index</h2>

<p>
    @Html.ActionLink("Create New", "Create")
</p>
<table>
    <tr>
        <th>
            QuestionText
        </th>
        <th>
            Sname
        </th>
        <th>
            Cname
        </th>
        <th></th>
    </tr>

@foreach (var item in Model) {
    <tr>
        <td>
            @Html.DisplayFor(modelItem => item.QuestionText)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.Sname)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.Cname)
        </td>

    </tr>
}

</table>

Мне кажется, что я не могу найти решение для этого, должен ли я возвращать свою view-модель внутри индекса действия контроллера?Любая помощь приветствуется.

Заранее спасибо!

С наилучшими пожеланиями!

Ответы [ 3 ]

7 голосов
/ 22 февраля 2012

См. Примечание внизу Поможет ли вернуть Enumerable?

 return View(Q.AsEnumerable()); 

РЕДАКТИРОВАТЬ: Да, я знаю, что мой первый выстрел был неправильным! ... не заметил, что вашview хочет получить

@model IEnumerable<NKI3.ViewModels.IndexCreateViewModel>

Я согласен с другими в отношении преобразования требуемого возвращаемого значения в соответствующий тип ... или настройки ожидаемого типа в представлении ... возможно, вы можете воспользоваться преимуществами отображения фреймворковнапример automapper (http://automapper.org/), чтобы помочь вам решить, как сопоставить код между объектами домена и моделями представления.

решать только вам - нет необходимости в дальнейшем голосовании ...

0 голосов
/ 22 февраля 2012

Тип, возвращаемый

db.Question.Include(a => a.SubjectType).Include(a => a.CoreValue);

выглядит как IQueryable<NKI3.Models.Question>

Вам необходимо преобразовать эту структуру (вашу модель данных) в IEnumerable<IndexCreateViewModel>

Если в вашем приложении еще нет помощника для преобразования между ними, вам нужно написать его.

IList<IndexCreateViewModel> viewmodel = new List<IndexCreateViewModel>();

foreach(NKI3.Models.Question item in Q)
{
   IndexCreateViewModel viewItem = new IndexCreateViewModel();
   // I don't know the properties of Question.
   viewItem.QuestionText = item.????;
   viewItem.CName = item.???;
   viewItem.SName =-item.???;
   viewModel.Add(viewItem);
}
return View(viewModel);
0 голосов
/ 22 февраля 2012

Да - действие должно возвращать модель того же типа, объявленную в первой строке вашего файла представления.

Измените первую строку в файле просмотра на:

@model IndexCreateViewModel

и измените код действия (Index()) на код, который будет возвращать объект типа IndexCreateViewModel.

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