UpdateModel () завершается ошибкой после перехода с MVC 1.0 на MVC 2.0 - PullRequest
0 голосов
/ 30 марта 2010

Мы находимся в процессе миграции нашего веб-приложения ASP.NET 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 вызывается, только если все валидаторы свойства были успешными.

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

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

1 Ответ

0 голосов
/ 01 апреля 2010

Хорошо, я использовал небольшую работу, которая делает работу.

Вместо использования неявного связывания 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

Надеюсь, это кому-нибудь пригодится:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...