我是一名ASP.NET MVC初学者,目前我使用EF和数据库优先的方法来完成我的工作。一切都很顺利,每个模型都有自己的控制器和视图文件。当我想在视图中保存多模型数据时,我会遇到问题。
就我而言:
- 我有一个ASP.NET MVC表单用于教师详细信息数据,另一个用于教师就业历史(这两个表单是从脚手架数据库方法自动生成的(
- 我想要一个视图
Create.cshtml
,用户可以在其中输入教师详细信息和就业历史,这些信息可以保存到他们自己的表中。因此,我使用tuple并遵循(一个视图中的多个模型(和(ASPMVC3中的一个视图内的两个模型(所做的操作。因此,我成功地在视图(Just界面(上创建了教师详细信息和就业历史 - 但我不知道如何将输入保存到不同的表中(两个表:
teacher
、employmentHistory
(。现在,当我保存输入时,什么都不会发生
我想我需要在控制器零件上做点什么,请给我一些如何做的想法。
提前感谢
首先,欢迎使用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
块中。