我正在努力弄清楚如何为创建其他对象的对象创建视图。
以下是我想要完成的一个简化示例:
public class Classroom
{
public int ID { get; set; }
public int RoomNumber { get; set; }
public string SchoolID { get; set; }
public School School { get; set; }
}
public class School
{
public int ID { get; set; }
public string Name { get; set; }
}
因此,当访问用于创建新教室的视图时,我希望用户能够输入学校名称。然后,当提交表单时,我希望它尝试将学校名称解析为现有学校。如果找到具有指定名称的学校,则在创建教室对象时将使用该学校。否则,它将创建一个新学校并将其添加到教室对象。
最好的方法是什么?
P.S。我在Visual Studio 2013中使用最新的实体框架
答案 0 :(得分:2)
创建一个ViewModel。
public class CreateClassroomModel
{
public string SchoolName { get; set; }
public int RoomNumber { get; set; }
}
public async Task<ActionResult> PostClassroom(CreateClassroomModel model)
{
var school = await _db.Schools
.FirstOrDefaultAsync(x => x.Name == model.SchoolName)
?? new School { Name = model.SchoolName };
var classroom = new Classroom
{
RoomNumber = model.RoomNumber,
School = school,
};
_db.Classrooms.Add(classroom);
await _db.SaveChangesAsync();
return RedirectToAction("CreateClassroomSuccess");
}
...然后你的视图就会有学校名称和教室数量的文本框。当您发布表单时,上面的操作会执行您想要的操作。如果找到名称匹配的学校,则使用该学校。否则,它会创建一所新学校。无论哪种方式,它总会创造一个新的教室。
如果您不想使用EF6异步功能,以下是没有异步的方法:
public ActionResult PostClassroom(CreateClassroomModel model)
{
var school = _db.Schools.FirstOrDefault(x => x.Name == model.SchoolName)
?? new School { Name = model.SchoolName };
var classroom = new Classroom
{
RoomNumber = model.RoomNumber,
School = school,
};
_db.Classrooms.Add(classroom);
_db.SaveChanges();
return RedirectToAction("CreateClassroomSuccess");
}
答案 1 :(得分:1)
我假设您将拥有来自DbContext的学校列表,因此当您在控制器的操作中获得学校名称时,您可以执行此操作。假设您在控制器中的操作具有schoolName参数
using (var context = new MyDBContext())
{
var school = context.Schools().FirstOrDefault(x => x.Name == schoolName);
if (school == null)
{
// create new school
}
else
{
var classroom = new Classroom
{
School = school,
// set other properties
}
}
}