Как получить представление в MVC, чтобы правильно ссылаться на требуемую модель - PullRequest
0 голосов
/ 03 апреля 2019

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

Элемент модели, переданный в словарь, имеет тип 'System.Collections.Generic.List`1 [WTCoro2.Models.Person]', нодля этого словаря требуется элемент модели типа 'WTCoro2.Models.PersonViewModel'. ", но проблема здесь в том, что я использую 'WTCoro2.Models.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 && 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 && 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; }
}

Ответы [ 3 ]

0 голосов
/ 03 апреля 2019

Ваш контроллер возвращает 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);

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

0 голосов
/ 03 апреля 2019

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

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

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();

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

0 голосов
/ 03 апреля 2019

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

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

var mymodel = new PersonViewModel();

...

return View(mymodel);
...