【问题标题】:ASP.MVC ModelBinding BehaviourASP.MVC 模型绑定行为
【发布时间】:2010-02-03 11:30:22
【问题描述】:

尽管这里有很多帖子,但这个让我很难过。

该场景是一个带有简单 CRUD 操作的基本 MVC(2) Web 应用程序。每当提交编辑表单并调用 UpdateModel() 时,都会引发异常:

System.Data.Linq.ForeignKeyReferenceAlreadyHasValueException 未被用户代码处理

这发生在作为实体表上的外键的 DropDownList 值上。但是,表单上还有另一个 DropDownList 列表,代表另一个外键,它不会抛出错误(不足为奇)。在编辑操作中手动更改属性值:

Recipe recipe = repository.GetRecipe(int.Parse(formValues["recipeid"]));
recipe.CategoryId = Convert.ToInt32(formValues["CategoryId"].ToString());
recipe.Page = int.Parse(formValues["Page"].ToString());
recipe.PublicationId=Convert.ToInt32(formValues["PublicationId"].ToString());

允许更新 CategoryId 和 Page 属性,然后在 PublicationId 上引发错误。在 db 和 dbml 中检查所有引用完整性。

欢迎对此提出任何启示。

【问题讨论】:

  • 我愿意。这只是一些进入错误的调试代码;)

标签: asp.net-mvc linq-to-sql


【解决方案1】:

此错误与模型绑定无关。相反,它与 LINQ to SQL 严格相关。您可以找到原因in this post的合理解释。

【讨论】:

  • 欣赏 Craig 的意见。我看过这篇文章,但无法调和 2 个事实: 1. 直到最近(几个月后我回到这个宠物项目——后来安装了一些框架)这工作得很好。 2. CategoryId 更新正常。它也是一个 FK 约束,但我注意到尽管有 db 约束,但尚未创建 EntityRef - 看起来在 dbml 创建中有些混乱。谢谢。
【解决方案2】:

使用以下代码更改您的代码

而不是

recipe.CategoryId = Convert.ToInt32(formValues["CategoryId"].ToString());

写这个

recipe.Category = db.GetCatById(formValues["CategoryID"]);

【讨论】:

    猜你喜欢
    • 2023-03-08
    • 1970-01-01
    • 2019-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多