ASP / MVC3 Бритва Линк - PullRequest
       6

ASP / MVC3 Бритва Линк

1 голос
/ 05 августа 2011

Я получаю эту ошибку для своего проекта.

Элемент модели, переданный в словарь, имеет тип 'System.Collections.Generic.List 1[<>f__AnonymousType2 2 [System.String, System.String]]', но этот словарь требует типового элемента типа 'System.Collections.Generic.IEnumerable`1 [ETMS.Models.DB.tblParent].

Описание: необработанное исключение произошло во время выполнения текущий веб-запрос. Пожалуйста, просмотрите трассировку стека для более информация об ошибке и ее возникновении в коде.

=============================================== ===================================

Что я хочу сделать, это получить данные из базы данных (один ко многим), это моя структура таблицы базы данных

tblparent
- Parent_ID
- Username
- Password
- Firstname
- Lastname

и

tblParentEmail
- ParentEmail_ID
- Email
- Parent_ID

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

public ActionResult Clientlist()
{
    using (ETMSPeopleEntities db = new ETMSPeopleEntities())
    {
        //var sxc = db.tblParents.Include("tblLocation").Include("tblParentEmails.ParentEmail_ID")
        //    .OrderByDescending(p => p.Status).ToList();
        var members = (from x in db.tblParentEmails
                      join y in db.tblParents
                      on x.Parent_ID equals y.Parent_ID 
                      select new { Email = x.ParentEmail, UserName = y.Username }).AsEnumerable();
        return View(members.ToList());
    }
}

Это мой админконтроллер

@model IEnumerable<ETMS.Models.DB.tblParent>
@{
    ViewBag.Title = "Clientlist";
}

<h2>Clientlist</h2>

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

@foreach (var item in Model) {
    <tr> 
        <td>
            @Html.DisplayFor(modelItem => item.Username)
        </td>
         <td>
            @Html.DisplayFor(modelItem => item.Firstname)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.Lastname)
        </td>
          <td>
            @Html.DisplayFor(modelItem => item.Location_ID)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.Email)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.CreateTime)
        </td>
        <td>
            @Html.ActionLink("Edit", "Edit", new { id=item.Parent_ID }) |
            @Html.ActionLink("Details", "Details", new { id=item.Parent_ID }) |
            @Html.ActionLink("Delete", "Delete", new { id=item.Parent_ID })
        </td>
    </tr>
}

</table>

это список клиентов

Ответы [ 5 ]

3 голосов
/ 05 августа 2011

Вы передаете список анонимных объектов для просмотра:

select new { Email = x.ParentEmail, UserName = y.Username }

Пока ожидание вида IEnumerable<ETMS.Models.DB.tblParent>:

@model IEnumerable<ETMS.Models.DB.tblParent>

Вы должны изменить свой выбор на:

select y

чтобы код работал.

Обновление

Вот как вы могли бы использовать шаблон модели представления. Сначала создайте класс модели представления, чтобы вы не передавали анонимный тип вашему представлению. Давайте назовем это AwesomeEmailViewModel, и похоже, что вам нужны .Email, .Username и некоторые другие свойства, поэтому мы также настроим их.

public class AwesomeEmailViewModel
{
    public string Email { get; set; }
    public string Username { get; set; }
    public string FirstName{ get; set; }
    public string LastName { get; set; }
    public int Location_ID{ get; set; }
    public DateTime CreateTime { get; set; }
}

Теперь измените ваш запрос, используя инициализацию объекта, чтобы заполнить экземпляр AwesomeEmailViewModel

Примечание: я угадываю какие свойства принадлежат каким объектам (или tblParent, или tblParentEmails, поэтому вам нужно будет дважды проверить эти

var members = (from x in db.tblParentEmails
               join y in db.tblParents
               on x.Parent_ID equals y.Parent_ID 
               select new AwesomeEmailViewModel()
               { 
                   Email = x.ParentEmail, 
                   UserName = y.Username,
                   FirstName = y.FirstName,
                   LastName = y.LastName,
                   Location_ID = x.Location_ID,
                   CreateTime = y.CreateTime, 
               }).ToList();
               // I don't know if you'll need the `AsEnumerable()` call

return View(members);

Наконец, ваше представление должно знать, какой тип (ы) ожидать, поэтому давайте изменим его, чтобы он ожидал список наших недавно созданных экземпляров AwesomeEmailViewModel.

@model IEnumerable<ETMS.Models.AwesomeEmailViewModel>

Обратите пристальное внимание, как я уже догадался, в пространстве имен. В любом случае, это должно дать вам доступ к нужным вам свойствам в вашем представлении. Если вам нужно больше, вам нужно изменить новый класс модели представления, который мы создали, а также запрос в действии вашего контроллера.

2 голосов
/ 05 августа 2011

Ваше представление ожидает tblParent, но вы передаете ему объединенную таблицу.

Вам необходимо создать ViewModel, объединить там свои таблицы и изменить свое представление так, чтобы оно ожидало ViewModel, а не tblParent.

Есть множество примеров. Вот один из них: Шаблон модели представления ASP.NET MVC

Надеюсь, это поможет

Дэви

1 голос
/ 05 августа 2011

В файле представления вам требуется модель типа IEnumerable ETMS.Models.DB.tblParent, а в контроллере вы передаете members.ToList () , вы должны изменить либо однучтобы он совпадал.

Вы можете создать видовую модель, подобную этой

public Class Client 
{ 
   public string Email {get;set;}
   public string UserName   {get;set;}
}

и вернуть список этого вместо анонимного типа в действии вашего контроллера, и вы определите IEnumerable типа Clientпо вашему мнению.

0 голосов
/ 05 августа 2011

Это потому, что вы сделали «выбрать новый», который создает новый анонимный тип. Представление ожидает tblParent. Анонимные типы не могут быть преобразованы в конкретный тип с помощью механизма представления. Чтобы исправить это, либо верните tblParent из вашего запроса LINQ, либо измените модель на "@model dynamic".

0 голосов
/ 05 августа 2011

Вы возвращаете анонимный тип из вашего запроса linq.Ваше мнение ожидает список типа tblParent

Проецируйте ваш linq на правильный тип, и он должен быть в порядке.

На первый взгляд это выглядит как

select new { Email = x.ParentEmail, UserName = y.Username })

должно быть

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