Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net 使用实体框架和MVC在一个视图中动态添加和删除项_Asp.net_Entity Framework_Asp.net Mvc 3_One To Many - Fatal编程技术网

Asp.net 使用实体框架和MVC在一个视图中动态添加和删除项

Asp.net 使用实体框架和MVC在一个视图中动态添加和删除项,asp.net,entity-framework,asp.net-mvc-3,one-to-many,Asp.net,Entity Framework,Asp.net Mvc 3,One To Many,我已经以不同的形式讨论了同一个问题有一段时间了(参见示例),但它仍然困扰着我,所以我想我应该更笼统地说: 我觉得这不是一个很不寻常的问题: 您有一个实体对象(使用实体框架),比如用户。用户有一些简单的属性,如FirstName、LastName等,但它也有一些对象属性列表,以众所周知的示例电子邮件为例,使其变得简单。电子邮件通常被设计为对象列表,以便您可以向该对象添加地址和类型(家庭、工作等)等属性。我用这个例子来保持它的通用性,但它可以是任何东西,关键是,您希望用户能够添加任意数量的这些项目。

我已经以不同的形式讨论了同一个问题有一段时间了(参见示例),但它仍然困扰着我,所以我想我应该更笼统地说:

我觉得这不是一个很不寻常的问题:

您有一个实体对象(使用实体框架),比如用户。用户有一些简单的属性,如FirstName、LastName等,但它也有一些对象属性列表,以众所周知的示例电子邮件为例,使其变得简单。电子邮件通常被设计为对象列表,以便您可以向该对象添加地址和类型(家庭、工作等)等属性。我用这个例子来保持它的通用性,但它可以是任何东西,关键是,您希望用户能够添加任意数量的这些项目。您还应该能够删除项目(旧地址或其他内容)

现在,在一个普通的网页中,您希望能够在同一个视图中添加这些项目。但是MVC的设计似乎只会让你在调用一个全新的视图来添加地址时更容易做到这一点。(在索引视图的模板中,您可以获得“创建新”链接,例如)

我遇到了几个例子,它们与我这里的意思非常接近:

问题是,尽管这些站点上的示例项目可以很好地使用模拟模型对象和简单的列表(而不是带有子列表的对象),但如果您真的想对发布的信息做些什么,这是另一回事——在我的例子中,通过实体框架模型保存到数据库。为了适应这些情况,我突然陷入了错综复杂的、绝对不是枯燥的代码的迷宫中。。。使用AutoMapper和诸如此类的工具处理对象,实体框架将不允许保存等等(如果您对细节感兴趣,请参阅上面的链接)

我想说的是,这真的有可能是一件不寻常的事情吗?是否在与父对象相同的视图中更新子集合(如本例中的电子邮件地址)?在我看来,这并不罕见,必须有一种标准的方法来处理这类场景,而我只是错过了它(到目前为止,这里还没有人能够为我指出一个严格的解决方案,可能是因为我用自己的应用程序示例将其变得过于抽象)


因此,如果有一个简单的解决方案,在我看来,这应该是一个简单的问题(因为设计是如此普遍),请告诉我。

您是否尝试过在史蒂文·安德森的博客链接上更新项目,以绑定到一个复杂的对象?在模型中创建一个名为Sack的类,并给它一个属性,看看是否可以让它工作

public class Sack
{
    public IEnumberable<Gift> Gifts { get; set; } 
}

好的,谢谢您的回答,但您是否尝试过通过EF模型保存到数据库?这就是我真正遇到问题的地方。另外,我不太理解您对Htmll帮助程序扩展的评论:“让它与项目中提供的前缀范围扩展接口。”?你到底是什么意思?@Anders一旦你把视图模型和数据放回原处,你的问题就不再是视图或MVC了,而是你正在使用的ORM。检查新项目的一个简单方法是假设所有具有特定id的列表项目都是新项目,并将现有id列表与持久化列表进行比较以执行删除。甚至可以更轻松地将删除作为ajax调用执行。这都是你想怎么做的,但在这一点上,你应该能够提出关于你的特定ORM的问题并得到更好的答案。好的,但这就是我在这里要做的,因为问题是关于组合:动态视图和实体框架。根据Sanderson示例,我实际上已经有了一个视图,但我无法通过EF将其保存到数据库中(请参阅我前面的问题)。因此,我重新开始了这个问题,试图通过将EF与这种视图相结合来找到解决问题的标准解决方案…@Anders因此,如果您能够以一种可理解的方式从视图中提取数据,请不要担心这一点。下一步,尝试仅使用实体框架按您的需要保存数据。。。实际上,创建一个全新的控制台项目,导入EF类并尝试保存数据。您可能有一些特定于EF的问题,而不需要考虑现有项目的开销。一旦您知道如何让EF在只使用EF而不使用其他工具时保存数据,就可以知道如何将视图模型映射到EF模型。细分你的问题,直到它变得无关紧要。好吧,但在“正常”场景中保存EF模型并没有任何问题,比如默认模板创建的场景,每个简单属性都有单独的视图。问题只会出现在与父对象位于同一视图中的子集合中。因此,保存数据本身并不是问题。请看我之前的问题(特别是这一个:)了解整个图片。我已经开始悬赏这个问题了。。。
public static class HtmlExtensions
{
    public static IHtmlString CollectionEditorFor<TModel, TValue>(this HtmlHelper html, Expression<Func<TModel, TValue>> expression)
    {
        if (/* type of expression value is not a collection */) throw new FailureToFollowTheRulesException("id10t");

        // your implementation
    }
}