Передать коллекцию объектов из контроллера в Asp.Net MVC - PullRequest
0 голосов
/ 28 апреля 2018

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

Server Error in '/' Application.
The model item passed into the dictionary is of type 'System.Collections.Generic.List`1[<>f__AnonymousType1`6[System.String,System.String,System.Nullable`1[System.DateTime],System.Nullable`1[System.DateTime],System.String,System.String]]', but this dictionary requires a model item of type 'System.Collections.Generic.IList`1[CaliberCoaching.Models.CareerInformation]'.
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. 

Exception Details: System.InvalidOperationException: The model item passed into the dictionary is of type 'System.Collections.Generic.List`1[<>f__AnonymousType1`6[System.String,System.String,System.Nullable`1[System.DateTime],System.Nullable`1[System.DateTime],System.String,System.String]]', but this dictionary requires a model item of type 'System.Collections.Generic.IList`1[CaliberCoaching.Models.CareerInformation]'.

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

 public ActionResult JobList()
        {
            CaliberCoachingContext objCaliberCoachingContext = new CaliberCoachingContext();
            var lstCareerInformation = (from job in objCaliberCoachingContext.CareerInformations
                                                            select new { job.NameOfPost, job.PostName, job.StartDate, job.LastDate, job.Eligibility, job.NoOfVacancies }).ToList();

            return View(lstCareerInformation);
        }

и вот мой взгляд

@model IEnumerable<CaliberCoaching.Models.CareerInformation>
@{
    ViewBag.Title = "JobList";
    Layout = "~/Views/Shared/_CommonLayout.cshtml";
}
@foreach (var item in Model)
{
    <div class="single-item-wrapper">

        <div class="courses-content-wrapper">
            <h3 class="title-default-left-bold">@item.NameOfPost</h3>
        </div>
    </div>
}

Пожалуйста, дайте мне решение этой проблемы.

1 Ответ

0 голосов
/ 28 апреля 2018

Исключение говорит само за себя! Ваше бритвенное представление строго типизировано для коллекции CareerInformation объектов, но из вашего метода действия вы передаете другому типу представление!

В вашем методе действия переменная lstCareerInformation представляет собой не коллекцию CareerInformation объектов, а коллекцию анонимных объектов. Это происходит потому, что ваше выражение LINQ выполняет проекцию на анонимный объект.

 select new { job.NameOfPost, job.PostName, job.StartDate,
              job.LastDate, job.Eligibility, job.NoOfVacancies }

select new создаст анонимный объект

Чтобы исправить ошибку, вы должны вернуть коллекцию CareerInformation объектов. Просто удалите проекционную часть из выражения LINQ.

public ActionResult JobList()
{
    var db = new CaliberCoachingContext();
    var careerInformationList = db.CareerInformations.ToList();
    return View(careerInformationList);
}

РЕДАКТИРОВАТЬ: Согласно комментарию

Я использовал анонимный объект, потому что я хочу выбрать конкретный столбцы вместо всех столбцов из свойств CareerInformation.

Тогда вы должны использовать модель представления. Создайте класс viewmodel со свойствами, необходимыми для вашего представления.

public class JobVm
{
   public string PostName { set;get;}
   public Eligibility { set;get;}
   public DateTime StartDate { set;get;}
   // Add other properties needed by the view 
}

Теперь в вашем методе действия проект создайте объекты модели представления из коллекции объектов сущностей, используя метод Select.

public ActionResult JobList()
{
    var db = new CaliberCoachingContext();
    var careerInformationList = db.CareerInformations
                                  .Select(a=> new JobVm { PostName = a.PostName,
                                                          StartDate = a.StartDate,
                                                          Eligibility = a.Eligibility })
                                  .ToList();
    return View(careerInformationList);
}

Здесь careerInformationList - это список JobVm объектов, и это то, что мы передаем в представление. Поэтому убедитесь, что ваше представление строго типизировано для коллекции JobVm объектов.

@model List<JobVm>
<h2>Jobs</h2>
@foreach(var job in Model)
{
   <div>@job.PostName</div>
   <p>@job.Eligibility</p>
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...