Представление MVC выдает ошибку

#c# #asp.net-mvc #entity-framework #asp.net-mvc-5

#c# #asp.net-mvc #entity-framework #asp.net-mvc-5

Вопрос:

У меня есть контроллер, который возвращает список сообщений

 public ActionResult MainMenu()
{
    var myDataOp = new DataBaseOperations();
    var Message=myDataOp.GetMessages();
    return View(Message);
}
  

Вот функция, которая получает список

 public List<ViewClass> GetMessages()
{
    PrincelysDataContext pData = new PrincelysDataContext();
    Princelys.Models.ViewClass myViewList =new ViewClass();
    var myMessage =from r in pData.Messages select r;
    DateTime presentTime = new DateTime();
    foreach (var myValues in myMessage)
    {
        myViewList.myMessage.Add(new ViewClass
        {
            CreatedName ="ffff",// (from m in pData.Users where m.userid == myValues.createdBy select m.userName).Single(),
            Messages = myValues.Message,
            CreateOn = myValues.createddatetime.Subtract(presentTime)
        });
    }
    return myViewList.myMessage;
}
  

Затем я использую свой список на странице просмотра.

 @model Princelys.Models.ViewClass
....
@foreach (var messageValues in Model.myMessage)
{
    <li class="left clearfix">
        <span class="chat-img pull-left">
            <img src="http://placehold.it/80/30a5ff/fff" alt="User Avatar" class="img-circle" />
        </span>
        <div class="chat-body clearfix">
            <div class="header">
                <strong class="primary-font">@messageValues.CreatedName</strong> <small class="text-muted">@messageValues.CreateOn.TotalHours mins ago</small>
            </div>
            <p>
                @messageValues.Messages
            </p>
        </div>
    </li>
  

}

Я получаю сообщение об ошибке при запуске страницы просмотра в браузере

Элемент модели, переданный в словарь, имеет тип ‘System.Коллекции.Generic.List`1[Princelys.Модели.ViewClass]’, но для этого словаря требуется элемент модели типа ‘Princelys.Модели.ViewClass’.

Это класс, который содержит свойства

 public class ViewClass
{
    public ViewClass()
    { myMessage = new List<ViewClass>(); }
    public string CreatedName { get; set; }
    public string Messages { get; set; }
    public TimeSpan CreateOn { get; set; }       
    public List<ViewClass> myMessage;
}
  

Это мой первый проект MVC 5. Любая помощь будет с благодарностью принята.

Комментарии:

1. мое объявление для модели: @model Princelys . Модели. Класс представления

2. Сообщение не требует пояснений. Ваш переход List<ViewClass> к представлению, которое ожидает одно ViewClass . Измените один или другой, чтобы они соответствовали

3. Вы не предоставили достаточно информации о том, что отображается в вашем представлении, но я подозреваю, что ваш метод должен быть public ViewClass GetMessages() таким, который содержит return myViewList; (не return myViewList.myMessage; )

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

Ответ №1:

Вы возвращаетесь List<ViewClass> в действие вашего контроллера, однако похоже, что ваше представление строго типизировано ViewClass . Измените его на @model IEnumerable<ViewClass> Или наоборот, т.Е. Возврат ViewClas из контроллера.

Основываясь на комментариях, проблема GetMessages должна вернуться ViewClass , поэтому она должна выглядеть следующим образом

 public ViewClass GetMessages()
{
    PrincelysDataContext pData = new PrincelysDataContext();
    Princelys.Models.ViewClass myViewList =new ViewClass();
    var myMessage =from r in pData.Messages select r;
    DateTime presentTime = new DateTime();
    foreach (var myValues in myMessage)
    {
        myViewList.myMessage.Add(new ViewClass
        {
            CreatedName ="ffff",// (from m in pData.Users where m.userid == myValues.createdBy select m.userName).Single(),
            Messages = myValues.Message,
            CreateOn = myValues.createddatetime.Subtract(presentTime)
        });
    }
    return myViewList;
}
  

Комментарии:

1. Основываясь на коде OP, вероятно, наоборот — контроллер должен вернуть ViewClass 🙂

2. Смотрите Мои комментарии к вопросу и ответ OP. Предлагаю вам отредактировать это, чтобы его можно было принять

Ответ №2:

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

 @model List<ViewClass>