#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