具有嵌入对象的ASP.NET MVC视图

时间:2014-01-25 03:43:46

标签: c# asp.net asp.net-mvc entity-framework

我正在努力弄清楚如何为创建其他对象的对象创建视图。

以下是我想要完成的一个简化示例:

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中使用最新的实体框架

2 个答案:

答案 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
        }
    }
}