2010-03-29 3 views
0

ASP.NET MVC 1.0 웹 응용 프로그램을 MVC 2.0으로 마이그레이션하는 중이지만 약간의 문제가 있습니다.MVC 1.0에서 MVC 2.0으로 마이그레이션 한 후 UpdateModel()이 실패합니다.

보고서 작성 마법사에서 제목 텍스트 상자를 비워두고 게시 작업에서 일반 제목으로 채우는 것이 가능합니다.

는 제목의 모델에 업데이트를 수행하는 코드는

입니다 :

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

는 MVC2 출시 내가이 주요 변경 참조 노트 읽기

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: 

를 던졌습니다 : 모델 객체에 대한

모든 재산을 그 IDataErrorInfo를 사용하여 새 값이 설정되었는지 여부에 관계없이 유효성 검사를 수행합니다. ASP.NET MVC 1.0에서는 새 값이 설정된 속성 만 유효성을 검사합니다. ASP.NET MVC 2에서 IDataErrorInfo의 Error 속성은 모든 속성 유효성 검사기가 성공적으로 수행 된 경우에만 호출됩니다.

그러나 이것이 나에게 어떤 영향을 미치는지 혼란 스럽습니다. 엔티티 프레임 워크 생성 클래스를 사용하고 있습니다.

왜 이것이 실패했는지 정확히 알 수 있습니까?

답변

0

좋아요, 나는 그 일을하는 작은 일을 사용했습니다.

대신 TryUpdateModel()FormCollection의 암시 적 바인딩을 사용하는, 지금 양식을 수정 한 후 TryUpdateModel()에 그것을 전달합니다. 이 사람에게 유용 TryUpdateModel 방법의 속성 화이트리스트를 사용하고

+0

, 그것은하지 않습니다 :)

 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 

희망 :

이 이제 코드? MVC 1에서 MVC 2 이상에서 수정 된 문제는 더 복잡한 객체 구조가 있고 EntityRef 객체를 연결 한 경우 화이트리스트 항목이 포함되어 있지 않으면 TryUpdateModel에서 업데이트됩니다. 해당 속성) 전체 "하위"개체의 ​​업데이트가 무시됩니다. 이것은 명백하게 "의도적으로"설계된 것입니다. 나를 위해 매우 귀찮았을 것입니다. –

관련 문제