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