Two ViewModel Tuple - PullRequest
       34

Two ViewModel Tuple

0 голосов
/ 26 октября 2018

У меня есть две модели просмотра.Один отображает информацию о сотруднике, а другой - информацию обо всех экстренных контактах, добавленных к сотруднику (1-ко-многим).

Мне удается отображать их информацию отдельно, но по какой-то причине, когда я пытаюсь объединить их в одном представлении, что-то идет не так.

Сначала я подумал, что наилучший подход к сдерживанию всего этогоинформация в одном представлении будет просто создать 1 ViewModel и добавить все необходимые поля.Но затем, когда я добавил поля для экстренных контактов, которые являются «многим» частью отношений, я не был уверен, как выполнить итерацию по ним внутри одной и той же возвращаемой модели (1-ко-многим).Из-за этого я попытался создать комбинированное представление, используя Tuple <>.К сожалению, это тоже не очень хорошо.Любая помощь с благодарностью.

Класс модели: PersonInfoViewModel

public class PersonInfoViewModel
{
    public int PersonId { get; set; }

    [Display(Name = "First Name")]
    public string FirstName { get; set; }

    [Display(Name = "Surname")]
    public string LastName { get; set; }

}

Класс модели: EmergencyContactViewModel

public class EmergencyContactViewModel
{
    public int EmergencyContactId { get; set; }

    [Display(Name = "First Name")]
    public string EmergencyContactFirstName { get; set; }

    [Display(Name = "Surname")]
    public string EmergencyContactLastName { get; set; }

}

Класс модели: CombinedView

public class CombinedView
{
    public Person PersonC { get; set; }
    public List<EmergencyContact> EmergencyContactsList { get; set; }
}

Действие контроллера: CombinedView

public ActionResult CombinedView(int id)
    {


        var person = _context.People.Find(id);

        ViewBag.PersonId = _context.People.Find(id);

        if (person != null)
        {
            List<EmergencyContactViewModel> ec = new List<EmergencyContactViewModel>(id);
            PersonInfoViewModel pi = new PersonInfoViewModel();
            return View(Tuple.Create(pi, ec));
        }

        return View();
    }

Действие контроллера: PersonInfo

    public async Task<ActionResult> PersonInfoViewModel(int? id)
    {
        var person = await db.People.FindAsync(id);// pull record from DB by id
        if (person != null)
            return View(new PersonInfoViewModel()
            {
                FirstName = person.FirstName,
                LastName = person.LastName
            });
        return View();
    }

Действие контроллера: EmergencyContactViewModel

    public ActionResult EmergencyContactViewModel(int? id)
    {
        List<EmergencyContact> emergecyContactsList = db.EmergencyContacts.ToList();

        List<EmergencyContactViewModel> personVmList = emergecyContactsList.Select(x =>
            new EmergencyContactViewModel
            {
                EmergencyContactId = x.EmergencyContactId,
                EmergencyContactLastName = x.EmergencyContactLastName,
                EmergencyContactFirstName = x.EmergencyContactFirstName,
            }).ToList();

        return View(personVmList);
    }

1 Ответ

0 голосов
/ 26 октября 2018

Так что да, ответ был довольно прост.Как уже упоминал Стивен, все, что мне нужно было сделать, это вернуть экземпляр CombinedView.Если кто-то застрял, как я, это может помочь вам:

    public ActionResult CombinedView(int id)
    {
        var person = _context.People.Find(id);

        ViewBag.PersonId = _context.People.Find(id);

        if (person != null)
        {
            return View(new CombinedView()
            {
                PersonC = person,
                EmergencyContactsList = new List<EmergencyContact>(person.EmergencyContacts)
            });
        }

        return View();
    }

Кроме того, в CombinedView:

@model [appname].Models.CombinedView

Кроме того, стоит отметить, что я попытался повторитьте же самые шаги, но на этот раз с фактическими моделями представления, как упомянуто в заголовке этого вопроса, но до сих пор не удалось.

public ActionResult CombinedView2(int id)
    {
        var person = _context.People.Find(id);

        if (person != null)
        {
            return View(new CombinedView2()
            {
                PersonInfo = new PersonInfoViewModel(),
                EmergencyContactList = new List<EmergencyContactViewModel>()
            });
        }

        return View();
    }
...