2010-03-29 4 views
0

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?

Répondre

0

OK, je l'ai utilisé un peu de travail autour qui fait le travail. Au lieu d'utiliser la liaison implicite du FormCollection au TryUpdateModel(), je modifie maintenant les formulaires, puis je le passe dans le TryUpdateModel().

c'est maintenant le code:

  if (string.IsNullOrEmpty(form["Title"])) 
       form["Title"] = reportConfiguration.Subject; 

      //update model with remaining forms collection: serialnumber, description, gasfactor, samplerate, checkforpolling 
      if (TryUpdateModel(reportToEdit, new[] { "Title" }, form)) 
      { 
       ...etc 

Espérons que cela est utile à quelqu'un :)

+0

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 –

Questions connexes