【问题标题】:Where to store Objects MVC5在哪里存储对象 MVC5
【发布时间】:2015-07-05 19:08:18
【问题描述】:

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

这是为了在用户在添加一些对象后离开表单时停止对数据库进行不必要的添加。

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

示例模型:

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;}
}

【问题讨论】:

  • 什么意思“直到最后提交”
  • 我已经更新了问题,抱歉,不清楚。因此,用户可以在提交到数据库之前添加任意数量的对象。
  • 您的意思是动态添加新的StudentCourse 对象吗?为什么不在一个视图中创建然后在一个操作中提交?
  • 之前尝试过但无法正常工作,我在 PartialViews 中有不同的模型 - 所以在这种情况下,学校有课程和学生的 PV,它们在各自的 PV 中控制,所以它对用户显示为一页。
  • 只有在你使用BeginCollectionItem helper 的情况下才能使用partials,或者你可以在this answer 中显示所有客户端。

标签: c# asp.net-mvc


【解决方案1】:

不建议使用 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

【讨论】:

  • 感谢您的回答,我会研究一下,从来没有想过这样做。
【解决方案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();
            }

【讨论】:

    猜你喜欢
    • 2021-03-17
    • 2012-02-24
    • 1970-01-01
    • 2017-03-19
    • 1970-01-01
    • 2015-07-23
    • 2020-07-14
    • 2016-02-26
    • 2014-01-14
    相关资源
    最近更新 更多