首先,欢迎来到 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
块中。