Форум программистов, компьютерный форум, киберфорум
Наши страницы
C#: ASP.NET MVC
Войти
Регистрация
Восстановить пароль
 
maksimka2112
2 / 1 / 1
Регистрация: 24.04.2010
Сообщений: 69
1

Ошибка: неправильный элемент модели, переданный в словарь

03.02.2018, 22:02. Просмотров 254. Ответов 2
Метки нет (Все метки)

Использую Code First. Связь многие-ко-многим. Модели:
Event
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
    public class Event
    {
        public int EventId { get; set; }
 
        public string Name { get; set; }
 
        public DateTime EventDate { get; set; }
 
        public string DateForDisplay{ get; set; }
 
        public string Place { get; set; }
 
 
        public virtual ICollection<User> Users { get; set; } 
        public virtual ICollection<UserEvent> UserEvents { get; set; }
 
        public Event()
        {
            Users = new List<User>();
            UserEvents = new List<UserEvent>();
        }
 
    }
User
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
    public class User
    {
        public int  UserId { get; set; }
 
        public string Name { get; set; }
 
        public int Age { get; set; }
 
        public string Email { get; set; }
 
        public string Gender { get; set; }
 
        public string Profession { get; set; }
 
        public virtual ICollection<Event> Events { get; set; }
        public virtual ICollection<UserEvent> UserEvents { get; set; }
 
        public User()
        {
            Events = new List<Event>();
            UserEvents = new List<UserEvent>();
        }
    }
Для объединения таблиц UserEvent
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
   public class UserEvent
    {
        public int UserId { get; set; }
 
        public int EventId { get; set; }
 
        public virtual User Users { get; set; }
        public virtual Event Events { get; set; }
 
        public virtual ICollection<UserEvent> UserEvents { get; set; }
 
        public UserEvent()
        {
            UserEvents = new List<UserEvent>();
        }
    }
Index в контроллере

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
   public class EventController : Controller
    {
        private UserContext db = new UserContext();
 
        public ActionResult Index()
        {
            var viewModel = db.Events
            .Where(e => e.EventDate >= System.DateTime.Now)
            .SelectMany(e => e.UserEvents.Select(ue => ue.Users))
            .ToList();
 
            return View(viewModel);
 
        }
Представление полупустое, но даже с таким ошибка:

C#
1
2
3
4
5
6
7
@model  TestApplication.Models.UserEvent
 
<h2>Index</h2>
 
<p>
    @Html.ActionLink("Create New", "Create")
</p>
Нужно было в таблице вывести события, а в последней ячейке каждой строки перечень пользователей, закреплённых за событием.
Данные в Users и Events формирую в методе Seed класса EventsDbInitializer : DropCreateDatabaseAlways.

Так же в модели есть
C#
1
2
3
4
5
6
    public class UserContext : DbContext
    {
        public DbSet<UserEvent> UserEvents { get; set; }
        public DbSet<User> Users { get; set; }
        public DbSet<Event> Events { get; set; }
    }
При попытке запуска появляется ошибка: Элемент модели, переданный в словарь, имеет тип "System.Collections.Generic.List`1[TestApplication.Models.User]", но для этого словаря требуется элемент модели типа "TestApplication.Models.UserEvent".

Подскажите что я делаю не так и как справиться с проблемой? Приму любую помощь: от подсказок до ссылок куда копать. Также интересует вопрос: в UserEvent ключи автоматически формируются или их нужно вводить в методе Seed ?

Добавлено через 2 часа 38 минут
Ошибку понял. В представление надо было передать:
C#
1
@model  List<TestApplication.Models.User>
Не пойму как сделать выборку, чтобы выводилась правильная информация: на каждую строку Event перечень User (свойство Name)

Пробую так в контроллере:
C#
1
2
3
4
5
6
7
8
9
10
11
12
            var viewModel = db.Events
                .Where(e => e.EventDate >= System.DateTime.Now)
                .Select(e => new
                {
                    Event = e,
                    Usesrs = e.UserEvents.Select(ue => ue.Users)
                }).ToList();
 
 
            ViewBag.viewModel = viewModel;
 
            return View();
Хотя бы во ViewBag уж вывести

В представлении делаю так:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
{
    ViewBag.Title = "Index";
}
 
<h2>Index</h2>
 
<p>
    @Html.ActionLink("Create New", "Create")
</p>
 
@foreach (var i in @ViewBag.viewModel)
{
    <b>
        @i.Event
    </b><br/>
 
}
Вывожу @i.Event, чтобы хотя бы понять, что там что-то есть.

Пишет ошибку: "object" не содержит определения для "Event". Что не так, товарищи?

Добавлено через 4 часа 21 минуту
Я 8 раз сошёл с ума, но сделал! Сделал!!! Кто молодец? Максим молодец!

Решение нашёл на сайте msdn....

Создаю отдельную сущность в папке ViewModels:

C#
1
2
3
4
5
6
    public class EventIndexData
    {
 
        public IEnumerable<Event> Events { get; set; }
        public IEnumerable<User> Users { get; set; }
    }
В контроллере:
C#
1
2
3
4
5
6
7
8
9
10
11
12
        public ActionResult Index()
        {
            var viewModel = new EventIndexData();
 
            viewModel.Events = db.Events
                .Include(i => i.Users)
                .Where(i => i.EventDate >= System.DateTime.Now)
                .OrderBy(i => i.EventDate);
 
            return View(viewModel);
 
        }
А вот View:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
@model TestApplication.ViewModels.EventIndexData
 
@{
    ViewBag.Title = "Index";
}
 
<h2>Index</h2>
 
<p>
    @Html.ActionLink("Create New", "Create")
</p>
<table class="table">
    <tr>
        <th>Название</th>
        <th>Дата</th>
        <th>Место</th>
        <th>Участники</th>
        <th></th>
    </tr>
 
    @foreach (var item in Model.Events)
    {
        <tr>
            <td>
                @Html.DisplayFor(modelItem => item.Name)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.DateForDisplay)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.Place)
            </td>
            <td><b>Число участников: @item.Users.Count </b> <br />
                <ul>
                @{
                    foreach (var user in item.Users)
                    {
                        <li>
                            @user.Name <br />
                        </li>
                    }
                }
                </ul>
            </td>
 
            <td>
                @Html.ActionLink("Edit", "Edit", new { id = item.EventId }) |
                @Html.ActionLink("Details", "Details", new { id = item.EventId }) |
                @Html.ActionLink("Delete", "Delete", new { id = item.EventId })
            </td>
        </tr>
                    }
 
</table>
Надеюсь, кому-нибудь поможет. Да, я кстати сегодня 2 раза видел чертей, поэтому наверное пора лечь спать...Ох, и суббота выдалась
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.02.2018, 22:02
Ответы с готовыми решениями:

Элемент модели, переданный в словарь, имеет тип "Int32", но для этого словаря требуется элемент модели типа "Calc"
Текст ошибки: System.InvalidOperationException: Элемент модели, переданный в...

Ошибка при частичном представлении: Элемент модели, переданный в словарь, имеет тип "System.String"
Всем добрый вечер. Пытаюсь реализовать вывод частичного представления в мастер...

Неправильный набор массива в модели
Подскажите, В Laravel 5.4 есть модель app/MyRestfulModel.php со списком...

Неправильный расчет Simulink модели
Здравствуйте, извините за беспокойство. Я обучаюсь работать в Simulink (Матлаб...

Неправильный минимальный элемент
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; using namespace std; int main() {...

2
XIST
1122 / 834 / 116
Регистрация: 01.10.2009
Сообщений: 2,535
Записей в блоге: 1
04.02.2018, 16:14 2
Цитата Сообщение от maksimka2112 Посмотреть сообщение
2 раза видел чертей, поэтому наверное пора лечь спать
скорее в церковь сходить)
0
maksimka2112
2 / 1 / 1
Регистрация: 24.04.2010
Сообщений: 69
04.02.2018, 16:17  [ТС] 3
XIST

Некогда! Горю!
Может поможете здесь?,
Сортировка внутреннего подзапроса
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.02.2018, 16:17

Поместить элемент в произвольное место в словарь
Здравствуйте! Есть словарь с такой структурой D={None: None, None: None} ...

Как найти больший элемент используя словарь?
Здравствуйте, помогите пожалуйста найти ошибку. Условие задачи: есть текстовый...

Алфавитно-частотный словарь: новый элемент добавить в голову
алфавитно-частотный словарь. задание:новый элемент добавить в голову. ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru