У меня две модели просмотра. Один отображает информацию о сотруднике, а другой отображает информацию о любых контактах для экстренных ситуаций, добавленных к сотруднику (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);
}
Так что да, ответ был довольно прост. Как упомянул Стивен выше, все, что мне нужно было сделать, это вернуть экземпляр 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();
}
Вы должны возвращать экземпляр
CombinedView
(и использовать цикл в своем представлении для отображенияEmergencyContactsList
)