Как получить представление в MVC для правильной ссылки на требуемую модель

#c# #razor #model-view-controller

#c# #razor #модель-представление-контроллер

Вопрос:

Это ошибка, которую я получаю

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

Я уже пытался делать то, что подсказывает ошибка, и это все еще выдает мне ту же ошибку.

Вот мое мнение:

 @model WTCoro2.Models.PersonViewModel

@{
    ViewBag.Title = "Multidata";
}

<h2>Multidata</h2>
<h2>People</h2>
<div>
    @{ WebGrid obj = new WebGrid(source: Model.pers, canPage: true, rowsPerPage: 10);}
    @obj.GetHtml();
</div>
<br />

<h2>Employees</h2>
<div>
    @{ WebGrid obj1 = new WebGrid(source: Model.emp, canPage: true, rowsPerPage: 10);}
    @obj1.GetHtml();
</div>
  

Вот мой контроллер:

 // GET: People
public ActionResult Multidata(string sortOrder, string searchString, string currentFilter, int? page, string searchBy, string startdate = null, string enddate = null)
{
    var mymodel = new PersonViewModel();
    ViewBag.CurrentSort = sortOrder;
    ViewBag.NameSortParm = String.IsNullOrEmpty(sortOrder) ? "name_desc" : "";
    var people_list = mymodel.pers = db.People.ToList();
    var employee_list = db.Employees.ToList();
    var history_list = mymodel.history = db.EmployeeDepartmentHistories.ToList();
    /* if (searchString != null)
     {
         page = 1;
     }
     else
     {
         searchString = currentFilter;
     }
     ViewBag.CurrentFilter = searchString;*/
    searchString = "";
    if (searchBy == "Title")
    {
        return View(employee_list.Where(x => x.JobTitle == searchString || searchString == null).ToList());
    }
    /*  else if (startdate != null amp;amp; enddate != null)
      {
          DateTime start = DateManager.GetDate(startdate) ?? DateTime.Now;
          DateTime end = DateManager.GetDate(enddate) ?? DateTime.Now;
          return View(history_list.Where(x => x.StartDate >= start amp;amp; x.EndDate <= end).ToList());

      }*/
    else
    {
        return View(people_list.Where(x => x.FirstName.StartsWith(searchString) || x.LastName.StartsWith(searchString) || searchString == null).ToList());
    }
}
  

И моя ViewModel:

 public class PersonViewModel
{
    public IEnumerable <Person> pers { get; set; }
    public Person Person { get; set; }
    public IEnumerable <EmployeeDepartmentHistory> history { get; set; }
    public EmployeeDepartmentHistory EmployeeDepartmentHistory { get; set; }
    public IEnumerable <Employee> emp { get; set; }
    public Employee Employee { get; set; }
}
  

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

1. Вы не возвращаете свою модель представления из своего метода действия.

Ответ №1:

Ваш контроллер возвращает IEnumerable<Person> вместо PersonViewModel . Либо изменить представление:

 @model IEnumerable<WTCoro2.Models.PersonViewModel.pers>
  

или изменение в контроллере:

 mymodel.pers = (people_list.Where(x => x.FirstName.StartsWith(searchString) || x.LastName.StartsWith(searchString) || searchString == null).ToList();

return View(mymodel);
  

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

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

1. этот способ работает, спасибо! вы оказали реальную помощь. Правильные соглашения об именовании — это моя плохая привычка, от которой я пытаюсь избавиться

Ответ №2:

Yout view ожидает PersonViewModel. Но вы передаете PersonList.

В вашем случае вы должны передать PersonViewModel .

 var mymodel = new PersonViewModel();

...

return View(mymodel);
  

Ответ №3:

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

Итак, что вы хотите сделать, по сути, это:

 public ActionResult Multidata(string sortOrder, string searchString, string currentFilter, int? page, string searchBy, string startdate = null, string enddate = null)
{
    var mymodel = new PersonViewModel();
    ViewBag.CurrentSort = sortOrder;
    ViewBag.NameSortParm = String.IsNullOrEmpty(sortOrder) ? "name_desc" : "";
    mymodel.pers = db.People.ToList();
    mymodel.emp = db.Employees.ToList();
    mymodel.history = db.EmployeeDepartmentHistories.ToList();
    /* ... */
    if (searchBy == "Title")
    {
        return View(mymodel.Where(x => x.emp.JobTitle == searchString || searchString == null).ToList());
    }
    else
    {
        return View(mymodel.Where(x => x.pers.FirstName.StartsWith(searchString) || x.pers.LastName.StartsWith(searchString) || searchString == null).ToList());
    }
}
  

Ключевой момент находится в этих строках:

 var people_list = mymodel.pers = db.People.ToList();
  

Вы присваиваете данные из вашего источника данных вашей viewmodel и отдельной переменной. И затем вы пытаетесь вернуть people_list вместо mymodel .
people_list имеет тип List<Person> , в то время как mymodel имеет тип List<PersonViewModel> .
Проще всего просто избавиться от этих переменных и упростить его, просто используя вашу viewmodel