在哪里存储对象MVC5

时间:2015-04-27 11:00:05

标签: c# asp.net-mvc

构建一个可以包含许多对象的用户输入表单(viewmodel包含其他对象的列表),这些对象可以添加和删除(添加的那些将显示在来自部分页面的列表中),但我不希望要发送到数据库的对象,直到最终提交,所有对象将立即发送到数据库。

如果用户在添加一些对象后离开表单,则停止对数据库进行不必要的添加。

实现这一目标的最佳方法是什么?我在考虑将模型存储在由控制器更新的会话中 - 这是可取的吗?

示范模型:

public class ViewModel
{
    public string SchoolName {get;set;}
    public List<Student> student {get;set;}
    public List<Course> courses {get;set;}
}

public class Student
{
    public string Name {get;set;}
}

public class Course
{
    public string Code {get;set;}
}

2 个答案:

答案 0 :(得分:2)

我已经使用Sessions来支持页面之间的模型,减少了每次返回数据库的需要,也有助于添加列表。

考虑到你的学生模型,我会建议像下面的控制器,你可能会有一个会话,但它可能会变得复杂;我更想尝试两个课程,一个是学生,一个是课程。

    public ActionResult Index()
            {
                if (Session["StudentSession"] != null)
                {
                    List<Student> Students = (List<Person>)Session["StudentSession"];
                    // do something
                }
                else // create a new session so you can do w/e
                {
                    List<Student> Students = new List<Student>();
                    Session["StudentSession"] = Students;
                }
                return View();
            }

答案 1 :(得分:0)

不建议使用MVC模式将对象图存储在内存中。您提及在会话中存储数据是实现所需内容的一种可能方式,但您可以简化模型并直接将数据保存在客户端和后期数据中。这将否定多个打开标签的问题,在工作流程中途退出......

[HttpGet]
public ActionResult MyForm()
{
    var model = new MyFormModel();
    [...]
    return View(model);
}

[HttpPost]
public ActionResult MyForm(MyFormModel model)
{
    if (model.AddStudent)
    {
        // do some add student logic
    }

    if (model.AddCourse)
    {
        // add course logic
    }

    if (model.Submit)
    {
        // perform save
        return RedirectToAction("SomewhereElse");
    }

    return View(model);
}

查看

<form method="post">

    [...]

    <button type="submit" name="AddStudent" value="True">Add Student</button>

    <button type="submit" name="AddCourse" value="True">Add Course</button>

    <button type="submit" name="Submit" value="True">Save</button>

</form>

模型

public class ViewModel
{
    [...]
    public bool AddStudent { get; set; }
    public bool AddCourse { get; set; }
    public bool Submit { get; set; }
}

此技术应继续重新呈现视图并在页面中保留您的数据,直到您点击Save