构建一个可以包含许多对象的用户输入表单(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;}
}
答案 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
。