【问题标题】:Adding and removing items dynamically in one View with Entity Framework and MVC使用 Entity Framework 和 MVC 在一个视图中动态添加和删除项目
【发布时间】:2011-03-01 12:40:31
【问题描述】:

我已经以不同的形式处理同一个问题有一段时间了(参见例如Entity Framework and MVC 3: The relationship could not be changed because one or more of the foreign-key properties is non-nullable),但它仍然困扰着我,所以我想我应该更笼统地说一下:

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

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

现在,在普通网页中,您希望能够在同一个视图中添加这些项目。但是,如果您调用一个全新的 View 只是为了添加地址,MVC 似乎设计的只是使执行此操作变得容易。 (例如,在索引视图的模板中,您会看到“新建”链接)。

我遇到了几个例子,它们的作用与我在这里的意思很接近:

http://haacked.com/archive/2008/10/23/model-binding-to-a-list.aspx

http://blog.stevensanderson.com/2010/01/28/editing-a-variable-length-list-aspnet-mvc-2-style/

问题是,尽管这些站点上的示例项目工作正常,使用模拟模型对象和简单的列表(不是具有子列表的对象),但如果您真的想对发布的信息做一些事情,那就是另一回事了- 在我的情况下,通过实体框架模型保存到数据库。为了适应这些情况,突然间我陷入了错综复杂且绝对不是 DRY 代码的迷宫中……用 AutoMapper 之类的东西玩弄对象,而实体框架不会让你保存等等(见上文如果您对详细信息感兴趣,请链接)。

我想知道的是,这真的有可能是一件如此不寻常的事情吗?在与父对象相同的视图中更新子集合(例如本例中的电子邮件地址)?在我看来,这根本不常见,必须有一种标准的方法来处理这种情况,而我只是想念它(到目前为止,这里没有人能够指出我的直截了当解决方案,也许是因为我用自己的应用程序示例使其过于抽象)。

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

【问题讨论】:

    标签: asp.net entity-framework asp.net-mvc-3 one-to-many


    【解决方案1】:

    您是否尝试在指向 Steven Anderson 的博客的链接中更新项目以绑定到复杂对象?在模型中创建一个名为 Sack 的类,并给它一个属性,看看你是否可以让它工作。

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

    我只花了一分钟的时间就按照我的想法启动并运行它。我接下来要做的改进是添加一个与Html.EditorFor(m =&gt; m.SomeProperty) 基本相同的 HtmlHelper 扩展,只是将其称为更有意义的名称,并使其与项目中提供的前缀范围扩展接口。

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

    【讨论】:

    • 好的,感谢您的回答,但您是否尝试过通过 EF 模型保存到数据库?那是我真正遇到问题的地方。另外,我不太明白您对 Htmll 帮助程序扩展的评论:“让它与项目中提供的前缀范围扩展接口。”?你到底是什么意思?
    • @Anders 将视图模型与数据一起返回后,您的问题不再是视图或 MVC,而是您正在使用的 ORM。检查新项目的一种简单方法是假设所有具有特定 id 的列表项目都是新项目,并将现有的 Id 列表与持久列表进行比较以执行删除。或者更容易将删除作为 ajax 调用执行。这就是您想要的方式,但此时您应该能够就您的特定 ORM 提出问题并获得更好的答案。
    • 好的,但这就是我在这里尝试做的,因为问题是关于组合:动态视图和实体框架。实际上,我已经有一个根据 Sanderson 示例工作的视图,但是我无法通过 EF 将其保存到数据库中(请参阅我以前的问题)。所以我重新开始了这个问题,试图找到一些标准的解决方案,将 EF 与这种 View 结合起来......
    • @Anders 因此,如果您能够以可理解的方式从视图中提取数据,请不要担心。接下来尝试仅使用实体框架保存数据...事实上,创建一个全新的控制台项目,导入您的 EF 类并尝试保存数据。您可能有一些特定于 EF 的问题,而无需现有项目的开销。一旦您弄清楚如何让 EF 在仅使用 EF 而没有别的时保存数据,您就可以弄清楚如何将视图模型映射到 EF 模型。细分你的问题,直到它变得微不足道。
    • 好的,但是在“正常”场景中保存 EF 模型确实没有任何问题,例如由默认模板创建的场景,每个简单属性都有单独的视图。问题只出现在与父对象相同的视图中的子集合中。所以保存数据本身不是问题。请查看我之前的问题(尤其是这个问题:stackoverflow.com/questions/5132917/…)以了解整个图片。我已经开始在这个问题上悬赏......
    猜你喜欢
    • 1970-01-01
    • 2011-04-29
    • 1970-01-01
    • 2012-11-19
    • 1970-01-01
    • 1970-01-01
    • 2015-01-18
    • 1970-01-01
    相关资源
    最近更新 更多