从ASP.NET MVC Web表单创建和编辑相关实体

时间:2014-02-05 02:25:20

标签: asp.net-mvc database entity-framework

我正在创建一个带有数据库的ASP.NET MVC 4 Web应用程序和用于Web表单的Entity Framework 5来维护Document(aka Contract)条目。

下面是我为SQL Server中的数据库创建的ERD示例(带有导航属性的edmx图表)。对于MVC Web应用程序,模型是使用带有.edmx文件的DB生成的。

enter image description here

基于Model,我已经设置了一个可以创建和编辑Document的表单,如下所示: enter image description here

文档创建和编辑视图

此视图指的是Document model类。所以使用html helper(Html.TextBoxFor ...等)的所有输入字段都是从Document对象及其相关对象引用的(第1节和第2节)。该复选框隐藏并显示带有JS / jQuery的部分的子表单。对于编辑视图,我使用与创建视图相同的内容,除了它包含其他隐藏的ID字段以标识要从数据库编辑的记录。 我通过以下方式添加了一个可变长度列表来添加节项目: http://blog.stevensanderson.com/2010/01/28/editing-a-variable-length-list-aspnet-mvc-2-style/ 在项目动态列表的局部视图中,我使用Section1Item和Section2Item作为模型参考。

文档控制器的创建方法 因此,创建在Create(...)方法中发布的文档对象包含Document中包含该部分属性的所有属性。 如果第1节&的复选框值。第2节是假的,然后我设置了文件的第1节&第2节如此为null:

if (section1_chkbox == false) {
   document.Section1 = null; 
}

我必须将动态列表中的每个项目添加到文档对象中,如下所示:

foreach(Section1Item item in itemsList) {
   document.Section1.Section1Items.Add(item);
}

最后,DocumentController中的Create方法在db上下文中添加文档并保存更改。该文档及其相关实体已成功添加到数据库表中。

文档控制器的编辑方法

但是当我使用DocumentController中的Edit方法编辑文档时,对于Section1Items中的某些相关对象,某些section1对象的ID为null,则存在一些不一致。例如,当存在Section1Items时,发布的Document对象(用于编辑)不包含对Section 1对象ID的引用。 因此,更新现有文档记录非常繁琐和混乱,因为我必须检查对象的ID属性。在保存或设置对象的条目状态为修改时,关系中始终存在错误的主要对象和从属对象等错误。

我的问题

如何设置视图和控制器以实现文档的功能创建和编辑及其相关实体,如在表单的界面中一样?我需要一种有效且正确的方法来使用Entity Framework。如果这样可以更容易,我如何使用视图模型?

1 个答案:

答案 0 :(得分:0)

根据您在此处的描述,我了解到Section1Items中对Section1的虚拟引用存在问题。换句话说,问题是实体框架模型不适合您的显示需求。您需要渲染重复的实体以在视图中映射entier文档。我是对的吗?

如果是这种情况,我会看到两个解决方案:

  • 就像你建议使用视图模型来解决问题一样。如果您确认问题,我可以尝试编写示例视图模型。
  • serialzie / encrypt entier文档在您的视图中,然后将编辑结果与加密文档合并。您可以使用Mvc3Futures功能来实现这一目标。

在视图中序列化并加密您的文档:

@Html.Serialize("Document", Model, SerializationMode.EncryptedAndSigned)

对于deserialzie和解密你可以使用:

public ActionResult Edit(string id,[Deserialize(SerializationMode.EncryptedAndSigned)]Document document)