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