问题
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 asTryUpdateModel()
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