ASP.NET MVC 2 - “The model of type 'XYZ' could not be updated” when using UpdateModel and LINQ to Entities (.NET 3.5)

坚强是说给别人听的谎言 提交于 2019-12-06 23:14:14

问题


I have a model set up using LINQ to Entities and have code working that adds to the database as expected. However, I can't get UpdateModel to work when I am using .NET 3.5.

[HttpPost]
public ActionResult Edit(Site.Models.XYZ xyz)
{
    try
    {
        var original = db.XYZ.First(u => u.id == xyz.id);
        UpdateModel(original);
        db.SaveChanges();

        return RedirectToAction("Index");
    }
    catch (Exception ex)
    {
        return View("Error");
    }
}

This results in the following exception:

System.InvalidOperationException was caught
  Message=The model of type 'Site.Models.XYZ' could not be updated.
  Source=System.Web.Mvc
  StackTrace:
       at System.Web.Mvc.Controller.UpdateModel[TModel](TModel model, String prefix, String[] includeProperties, String[] excludeProperties, IValueProvider valueProvider)
       at System.Web.Mvc.Controller.UpdateModel[TModel](TModel model, String prefix)
       at Site.Controllers.XYZController.Edit(Site.Models.XYZ xyz) in D:***.cs:line 81
  InnerException: 

If I do UpdateModel(xyz) the exception does not occur, but the data does not save either.

How can I get UpdateModel to work with this (without updating to .NET 4.0), why can't it be updated (exception is not helpful as there is no inner exception)?


回答1:


Managed to solve the problem. Can be done in one of two ways:

TryUpdateModel(original)

or

db.ApplyPropertyChanges(original.EntityKey.EntitySetName, xyz)

No idea why TryUpdateModel will work but UpdateModel won't. Maybe just a bug in .NET 3.5.




回答2:


what I do in my MVC projects is grab the source code for the DefaultModelBinder from Codeplex and paste it into a new class in your project, like MyDefaultModelBinder. then register that model binder in your global.asax:

ModelBinders.Binders.DefaultBinder = new MyDefaultModelBinder();

this lets you set a breakpoint in the BindModel method, and you can figure out why it's not able to bind.




回答3:


Use TryUpdateModel() instead of UpdateModel() function to solve this

Both UpdateModel() and TryUpdateModel() function are used to update the model with the form values and perform validations.

Difference between UpdateModel() & TryUpdateModel()

UpdateModel() throws an exception if validation fails , where as TryUpdateModel() will never throw an exception, it return true or false




回答4:


You can this method (this is work for me)

protected internal void UpdateModel<TModel>(TModel model, string[] includeProperties) where TModel : class;

Example;

string[] includeProperty = { xyz.Id.ToString(),xyz.Name}; UpdateModel(uye, includeProperty);

来源:https://stackoverflow.com/questions/3761085/asp-net-mvc-2-the-model-of-type-xyz-could-not-be-updated-when-using-update

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!