我现在已经以不同的形式对待同一个问题了一段时间(参见例如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等。但它也有一些对象属性列表,采用众所周知的示例电子邮件,使这个简单。电子邮件通常被设计为对象列表,以便您可以添加该对象属性,如地址和类型(主页,工作等)。我使用它作为一个例子来保持它的通用性,但它可以是任何东西,重点是,你希望用户能够添加任意数量的这些项目。您还应该能够删除项目(旧地址或其他)。
现在,在普通网页中,您可以在同一个视图中添加这些项目。但是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/
问题是,虽然这些网站上的示例项目工作正常,使用模拟模型对象,而只是列表(不是带有子列表的对象),但如果您真的想要对发布的信息执行某些操作,则会有所不同 - 在我的情况下通过Entity Framework模型保存到数据库。为了使这些情况适应这种情况,突然之间,我处于一个错综复杂,绝对不是DRY代码的迷宫中......用AutoMapper和诸如此类的东西来处理对象,并且实体框架不会让你保存等等(见上文)如果您对细节感兴趣,请链接。
我想要得到的是,这是一个非常普遍的想法吗?在与父对象相同的View中更新子集合(例如本例中的电子邮件地址)?在我看来它根本不常见,并且必须有一种处理这种情况的标准方法,我只是错过了它(到目前为止,没有人能够指出我这样一个直截了当的方式解决方案,也许是因为我用我自己的应用程序示例使它太抽象了。)
因此,如果有一个简单的解决方案,我认为应该是一个简单的问题(因为设计很常见),请告诉我。
答案 0 :(得分:0)
您是否尝试在链接到Steven Anderson的博客时更新项目以绑定到复杂对象?在名为Sack的模型中创建一个类,并为其提供单个属性,看看是否可以使其工作。
public class Sack
{
public IEnumberable<Gift> Gifts { get; set; }
}
我认为你打算让它运转起来只花了我一分钟。我接下来要做的改进是添加一个与Html.EditorFor(m => 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
}
}