Во-первых, добро пожаловать в StackOverflow!
Вы правы, вы должны что-то сделать с контроллером.
- Я бы создал
ViewModel
для представления.Делая это, вы можете проецировать данные из базы данных любым способом, который необходим в представлении.Кроме того, при таком подходе вы не возвращаете полную сущность, возможно, там есть некоторая конфиденциальная информация.И вы также можете воспользоваться преимуществами проверки модели.(Например, что если в какой-то момент вам нужно добавить другое поле из другой сущности?) - Я бы также создал частичные представления для информации в модели представления и передал эту модель в частичное представление, таким образомвозможность повторного использования представлений, если это необходимо.
- При передаче данных в контроллер вы можете передать
ViewModel
и затем сохранить данные в базе данных.
Поскольку вы не предоставили никакой информации о модели ваших классовЯ приведу ниже пример.В любом случае (просмотрите модель или пример кортежа, которому вы следовали), вы должны изменить код контроллера, аналогично тому, что я пишу ниже.
public class TeacherViewModel
{
//teacher details
[Required]
public int TeacherId {get; set;}
[Required]
public string TeacherName {get; set;}
// {...}
//teacher employment info
//here you can have a list of information or the last entry in the history,
//or what's required to add a new entry
public string LastWorkPlace {get; set;}
public DateTime From {get; set;}
public To {get; set; }
//{...}
}
public class TeacherController: Controller
{
//{...}
[HttpPost]
public ActionResult SaveTeacherInfo(TeacherViewModel model){
if (ModelState.IsValid) {
var teacher = new TeacherEntity
{
TeacherId = model.TeacherId, //if update otherwise leave blank
TeacherName = model.TeacherName
//{...}
};
//your context name here
_dbContext.Teachers.Add(teacher);
var teacherEmploymentInfo = new TeacherEmploymentHistory
{
TeacherId = teacher.TeacherId,
LastWorkPlace = model.LastWorkPlace,
From = model.From,
To = model.To
//{...}
};
_dbContext.TeachersEmploymentInfo.Add(teacherEmploymentInfo);
_dbContext.SaveChanges();
//_dbContext.SaveChangesAsync(); if using async await
}
return View(model); //return any validation errors from the view model
// to the user to fix.
}
}
Если вы используете ErrorHandler
в качестве глобального фильтра, нет необходимостидля блока try..catch
, если вы не планируете возвращать пользовательские ошибки (например, BusinessException или DatabaseException) из контроллера, если нет, вам следует заключить код в блок try..catch
.