Nous sommes en train de migrer notre application Web ASP.NET MVC 1.0 à 2.0 MVC mais nous avons couru dans un petit accroc.UpdateModel() échoue après la migration de MVC 1.0 à 2.0 MVC
Dans notre assistant de création de rapport, il est possible laisser la zone de texte Titre vide et il a être rempli avec un titre générique (dans l'action post).
Le code qui fait la mise à jour sur le modèle du titre est:
if (TryUpdateModel(reportToEdit, new[] { "Title" }))
{
//all ok here try to create (custom validation and attach to graph to follow)
//if title is empty get config subject
if (reportToEdit.Title.Trim().Length <= 0)
reportToEdit.Title = reportConfiguration.Subject;
if (!_service.CreateReport(1, reportToEdit, SelectedUser.ID, reportConfigID, reportCategoryID, reportTypeID, deviceUnitID))
return RedirectToAction("Index");
}
Dans MVC 1.0, cela fonctionne correctement, le reportToEdit
a un titre vide si la zone de texte est vide, qui est ensuite rempli avec la propriété Subject
.
Dans MVC 2.0 échec/retourne false.
Si j'ajoute la ligne ci-dessus:
UpdateModel(reportToEdit, new[] { "Title" });
il jette
System.InvalidOperationException was unhandled by user code
Message="The model of type 'Footprint.Web.Models.Reports' 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[] includeProperties)
at Footprint.Web.Controllers.ReportsController.Step1(FormCollection form) in C:\TFS Workspace\ExtBusiness_Footprint\Branches\apitts_uioverhaul\Footprint\Footprint.Web\Controllers\ReportsController.cs:line 398
at lambda_method(ExecutionScope , ControllerBase , Object[])
at System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase controller, Object[] parameters)
at System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary`2 parameters)
at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary`2 parameters)
at System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClassd.<InvokeActionMethodWithFilters>b__a()
at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter filter, ActionExecutingContext preContext, Func`1 continuation)
InnerException:
Lecture du MVC2 Release Notes Je vois ce changement de rupture:
Chaque propriété pour les objets du modèle qui L'utilisation de IDataErrorInfo pour effectuer la validation est validée, qu'une nouvelle valeur ait été définie ou non. Dans ASP.NET MVC 1.0, seules les propriétés ayant de nouvelles valeurs définies seront validées. Dans ASP.NET MVC 2, la propriété Error de IDataErrorInfo est appelée uniquement si tous les validateurs de propriété ont réussi.
mais je suis confus comment cela me affecte. J'utilise les classes générées par le framework d'entité. Est-ce que quelqu'un peut indiquer exactement pourquoi cela échoue?
C'est en utilisant la liste blanche de propriété dans la méthode TryUpdateModel, est-ce pas? Le problème que j'ai trouvé avec (dans MVC 1, au moins peut-être qu'il a été corrigé dans MVC 2+) est que si vous avez une structure d'objets plus complexe et que vous avez des objets EntityRef liés, TryUpdateModel les mettra à jour sauf si des entrées de liste blanche sont incluses. leurs propriétés), auquel cas les mises à jour de l'objet "sub" entier sont ignorées. C'est, apparemment, "par conception" - c'est-à-dire nous ABC pour obtenir ce travail. Le plus ennuyeux, pour moi, car cela aurait été très utile –