2010-03-29 2 views
0

Мы находимся в процессе переноса нашего веб-приложения ASP.NET MVC 1.0 на MVC 2.0, но мы столкнулись с небольшой проблемой.UpdateModel() завершает работу после переноса с MVC 1.0 на MVC 2.0

В нашем мастере создания отчетов можно оставить текстовое поле «Заголовок» пустым и заполнить его общим типом (в посту после действия).

код, который делает обновление на модели заглавия:

  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"); 
      } 

В MVC 1.0, это работает правильно, reportToEdit имеет пустое название, если текстовое поле пустое, который затем заполняется Subject.

В MVC 2.0 это не работает/возвращает false.

Если добавить строку выше:

UpdateModel(reportToEdit, new[] { "Title" }); 

он бросает

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: 

Чтение MVC2 Заметки о выпуске я вижу это разрывная изменение:

Каждое свойство для модельных объектов, использовать идентификатор IDataErrorInfo для проверки валидации, независимо от того, установлено ли новое значение. В ASP.NET MVC 1.0 будут проверены только свойства с новыми значениями. В ASP.NET MVC 2 свойство Error IDataErrorInfo вызывается только в том случае, если все средства проверки свойств были успешными.

но я смущен, как это влияет на меня. Я использую классы, созданные сгенерированными сущностью.

Может ли кто-нибудь определить, почему это не удается?

ответ

0

ОК, я использовал небольшую работу, которая выполняет эту работу.

Вместо использования неявной привязки FormCollection к TryUpdateModel(), теперь я изменяю формы, а затем передаю их в TryUpdateModel().

это теперь код:

  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 

Надеется, что это полезно для кого-то :)

+0

Это использует свойство белого список в методе TryUpdateModel, не так ли? Проблема, которую я обнаружил с этим (в MVC 1, по крайней мере, возможно, это было исправлено в MVC 2+), если у вас есть более сложная структура объекта и связаны объекты EntityRef , TryUpdateModel будет их обновлять, если не включены записи в белый список (даже для их свойства), и в этом случае все обновления объекта «под» игнорируются. Это, по-видимому, «по дизайну» - то есть мы, CBA, чтобы это работало. Самое раздражающее, для меня, поскольку это было бы очень полезно –

Смежные вопросы