C# asp.NETMVC4代码优先:如何自动保存包含模型列表的复杂模型?

C# asp.NETMVC4代码优先:如何自动保存包含模型列表的复杂模型?,c#,ajax,asp.net-mvc-4,razor,knockout.js,C#,Ajax,Asp.net Mvc 4,Razor,Knockout.js,我正在创建一个测验创建者模块。共有5个科目。每个科目有2000个问题 比如说,它被称为“创建完整的模型测试”,它将包含100个问题,来自5个科目的20个问题。所以,20*5=100 在UI中,创建者将首先从下拉列表中选择“创建完整模型测试”。假设他选择了“全模型测试”。他必须从5个科目中选择一个科目,然后他必须为每个科目选择20个问题。然后必须将它们保存到“完整模型测试”部分 如果他选择英语,他将不得不选择20个问题,然后他将不得不选择另一门学科,例如物理,他将不得不选择另外20个物理问题,然后

我正在创建一个测验创建者模块。共有5个科目。每个科目有2000个问题

比如说,它被称为“创建完整的模型测试”,它将包含100个问题,来自5个科目的20个问题。所以,20*5=100

在UI中,创建者将首先从下拉列表中选择“创建完整模型测试”。假设他选择了“全模型测试”。他必须从5个科目中选择一个科目,然后他必须为每个科目选择20个问题。然后必须将它们保存到“完整模型测试”部分

如果他选择英语,他将不得不选择20个问题,然后他将不得不选择另一门学科,例如物理,他将不得不选择另外20个物理问题,然后他将不得不选择数学,然后不得不选择另外20个数学问题,依此类推。最后,表格将提交100个问题

现在,我的问题是,我如何将所选的问题自动保存到“完整模型测试”部分,以便他可以在提交表单之前继续保存5个受试者的问题

这是我的部门模型:

namespace MvcBCS.Models
{
public class Department
{
    [Key]
    public int DepartmentId { get; set; }
    public string DepartmentName { get; set; }
    public string DepartmentCode { get; set; }

    public virtual ICollection<Subject> Subject { get; set; }
    public virtual ICollection<Section> Section { get; set; }
    public virtual ICollection<Subsection> Subsection { get; set; }
}
}
以下是隶属模型:

namespace MvcBCS.Models
{
public class Subsection
{

    [ForeignKey("Department")]
    public int? DepartmentId { get; set; }
    public virtual Department Department { get; set; }

    [ForeignKey("Subject")]
    public int? SubjectId { get; set; }
    public virtual Subject Subject { get; set; }

    [ForeignKey("Section")]
    public int? SectionId { get; set; }

    public virtual Section Section { get; set; }

    [Key]
    public int SubsectionId { get; set; }
    public string SubsectionName { get; set; }
    public string SubsectionCode { get; set; }
}
}

您所需要的只是在客户端存储所有临时数据。 当您获得完整的过去,甚至是完整的数据集时,使用POST/JSON/XML/etc将其发送到服务器

我认为在这种情况下,您最好使用某种JavaScript框架,例如,只需点击几下,和几行代码,就可以将所有数据以基于对象的模型存储在客户端

不管怎样,无论您是否使用任何框架,您都应该使用JavaScript来存储所有数据,包括问题、答案和主题。JavaScript将允许您存储、验证和发送所需的所有数据

为了使JavaScript的使用更简单、更快,您可以使用库,其中包含与DOM结构和服务器端交互的函数


为了使学习KnockoutJS更容易,只需使用教程:

这就是我将尝试的方法

业务规则: -如果所有主题问题都由某个用户提交,则完整的模型测试将完成

假设:我们事先知道我们有五个科目。所以

public enum Subject
{
    English,
    Physics,
    ...
}
测试Poco实体结构:

public class Test
{
public int Id{get;set;}
public User CreatedBy{get;set;}
public Subject Subject{get;set;}
public bool IsFullTestCompleted{get;set;}

public string Question1{get;set;}
public string Question2{get;set;}
...
}
假设:
您可以使用局部视图/ajax/Jquery/Angularjs/Knockout,在您的
问题上下文中,使用任何最适合您的方法来实现它,以自动保存更改
您将添加必要的视图模型和适当的验证注释/属性
您将在必要时添加验证。
您将添加/更新测试实体。和第一个主题一样,您将把数据添加到测试实体中,然后更新它


希望能有所帮助

标题中的“自动保存”让我有点困惑。您的意思是,您希望在完成主题时保存每个主题的20个问题,还是将所有这些问题作为保存的完整表单的一部分?看起来您有一个模型,可以轻松地在客户端复制。所以您只需要在客户端保存主题之间的所有数据。@krillgar我想为每个主题保存20个问题。将使用html复选框属性选择问题,然后希望最终保存表单,以便使用单个提交按钮保存来自5个主题的100个问题。@U10,我将能够解析问题,但我需要为每个主题选择20个问题,然后使用一个提交表单保存100个问题。如果您存储的数据是JavaScript,则不需要表单本身。当您通过Ajax发送数据时,它将自行创建表单。我可以将我的代码发送给您吗?我有考试类型条目、科目条目、部分条目和子部分条目的模型和视图。因此,我可以创建许多类型,许多主题,有许多部分和小节。我已经设计了模块。如何共享代码并获得有用的答案?我被困在这里。我应该把我的代码放在这里,这样我就可以根据我的项目得到一个详细的答案吗?我被卡住了!当然我认为我们可以为您选择正确的解决方案。但您也应该先看一下knockoutJS。我将开始看knockoutJS。但是knockoutJS是否使用MVVM?或者MVC?KnockoutJS使用MVVM,因为它更简单,不需要像MVC那样的大型基础设施。
public enum Subject
{
    English,
    Physics,
    ...
}
public class Test
{
public int Id{get;set;}
public User CreatedBy{get;set;}
public Subject Subject{get;set;}
public bool IsFullTestCompleted{get;set;}

public string Question1{get;set;}
public string Question2{get;set;}
...
}