MVC2 在 UpdateModel() 中抛出 InvalidOperationException,试图更新 id 字段

Posted

技术标签:

【中文标题】MVC2 在 UpdateModel() 中抛出 InvalidOperationException,试图更新 id 字段【英文标题】:MVC2 throws InvalidOperationException in UpdateModel(), trying to update the id field 【发布时间】:2011-08-20 10:56:23 【问题描述】:

我的 MVC2 应用今天让我很伤心...我想使用以下控制器代码编辑数据库记录:

    [AcceptVerbs(HttpVerbs.Post), Authorize(Roles = "Admin")]
    public virtual ActionResult Edit(int id, FormCollection formValues)
    
        var masterDataProxy = MasterDataChannelFactory.OpenChannel();
        var tester = masterDataProxy.GetTester(id);
        masterDataProxy.CloseChannel();

        if (null == tester)
        
            return View(Views.NotFound);
        

        try
        
            UpdateModel(tester);

            var adminProxy = AdminChannelFactory.OpenChannel();
            adminProxy.AddUpdateTester(tester);
            adminProxy.CloseChannel();

            return RedirectToAction(Actions.Index());
        
        catch (Exception ex)
        
            ModelState.AddModelError("Tester", ex.Message);

            return View(tester);
        
    

我收到高级异常“无法更新‘Model.Entity’类型的模型”,当我深入了解 ModelState 时,我发现它在尝试更新 Id 字段时失败——”只有 .NET 3.5+ 在实体反序列化期间才支持设置 Id 属性”。

问题是,我如何告诉 UpdateModel() 不要更新 Id 字段?我不希望它更新那个字段!!

有什么想法吗? 戴夫

【问题讨论】:

【参考方案1】:

试试

UpdateModel(tester, formValues.ToValueProvider());

并确保 Id 不包含在 formValues 中。

【讨论】:

【参考方案2】:

使用TryUpdateModel(tester) insted of UpdateModel(tester)

【讨论】:

这不就是无一例外地失败吗?我可能对 Try..() 方法的作用有错误的理解,但我认为它们只是以更好的方式失败。它仍然没有解决根本问题...... Try..() 只是不会抛出 InvalidOperation 异常。所以,我在这里可能是错的。 @Bala 的回答可能会有所帮助。

以上是关于MVC2 在 UpdateModel() 中抛出 InvalidOperationException,试图更新 id 字段的主要内容,如果未能解决你的问题,请参考以下文章

在构造函数中抛出 ArgumentNullException?

在 finally 块中抛出异常

在Scala中抛出异常,啥是“官方规则”

你能在 Java 中抛出啥?

为啥在构造函数中抛出异常会导致空引用?

为啥我可以在 Java 中抛出 null? [复制]