0

我有一个具有此签名的操作:

public ActionResult Update(ContactForm contactForm)

ContactForm 是 edmx 文件中的一个类。先不打码。它的 EF 5.0.0。edmx 文件是自动生成的。

我有从 ContactForm 到 ContactFormField 的关系,这会导致导航属性。我将其命名为“字段”。它是类型

EntityCollection<ContactFormField>

当我在帖子中包含由帖子变量引起的字段(并且只有这样)时,如下所示:

ContactForm.Fields[0].Name=foo&ContactForm.Fields[1].Name=bar

ETC...

在调用该操作之前,我得到了 InvalidOperationException。

它发生在字段的设置器中。

消息是:

EntityCollection 已经初始化。InitializeRelatedCollection 方法只能在对象图的反序列化过程中被调用来初始化一个新的 EntityCollection。

如果我尝试采取单独采取字段的操作,请添加一个参数,例如

public ActionResult Update(ContactForm contactForm,
  IEnumerable<ContactFormField> fields)

...这些将被正确检索,但对于每个字段,我还有另一个 ContactFieldAlternative 列表。换句话说,我需要能够发布子对象。

如何摆脱异常?

4

1 回答 1

1

这里的问题是模型绑定器如何解释您的 URL 字符串。模型绑定器没有任何逻辑允许它假设 URL 字符串中的多个参数代表同一个对象。因此,它不是创建一个实例ContactForm并绑定您的字段,而是尝试创建一个实例ContactForm并绑定Fields[0]到该实例,然后尝试创建另一个实例ContactForm来绑定Fields[1]到,显然您的方法签名不接受。如果不为模型绑定器创建自定义重载,您真的无法使用此 URL 模式提交表单值(而且无论如何都不应该,imo)。通过帖子接受复杂对象的预期方法是通过表单元素或 JSON。ASP.Net MVC 框架的主要目标之一是使用静态 URL,而 URL 中的参数列表不是。

于 2013-09-18T10:46:14.270 回答