2010-12-16 5 views
0

큰 모델을 뷰에 밀어 넣고 있지만 해당 뷰의 일부만 업데이트하고 목록에는 여러 부분 뷰가 있습니다.ModelState가 유효성을 검사하는 기본 모델을 변경합니다.

본질적으로 원래 모델을 업데이트하는 코드가 있지만 게시 된 부분이 아닌 업데이트 된 원래 모델에 대해 ModelState.IsValid를 실행하려고합니다.

[HttpPost] 
public virtual ActionResult MyAction(MyFullModel sectionUpdates) 
{ 
    var updated = Session['original'] as MyFullModel; 
    for (var i=0; i<updated.Section.Count; i++) 
    { 
     var a = original.Section[i] as SubModel; 
     var b = sectionUpdates.Section[i] as SubModel; 

     if (String.IsNullOrWhiteSpace(a.Prop1)) 
     { 
      a.Prop1 = b.Prop1 
     } 
     if (String.IsNullOrWhiteSpace(a.Prop2)) 
     { 
      a.Prop2 = b.Prop2 
     } 
     ... 
    } 

    // ??? How do I run ModelState.IsValid against original here ??? 

    // this doesn't seem to work, the only the posted values are checked... 
    // ViewData.Model = model; 
    // ModelState.Clear(); 
    // if (!TryUpdateModel(model)) 
    // { 
    //  //model state is invalid 
    //  return View(secureFlightUpdates); 
    // } 

}

나는 위의 "업데이트"없습니다 "sectionUpdates"에 대한 유효성 검사를 실행합니다.

원래 정보가 잘 업데이트되었지만 섹션 업데이트가 아닌 원본에 대한 유효성 검사를 실행해야합니다. 이미 a.Prop1이있는 것처럼 게시물보기에 입력 필드가 없습니다. 상대적으로 크기 때문에 숨겨진 필드를 필요없이 서버에 다시 게시하고 싶지는 않습니다. 이 어떤 모델을 검증 할 수

+0

나는 혼란 스럽다. * 왜 * 업데이트 된 * 모델의 유효성을 검사하고 싶지 않으십니까? 원래 모델이 변경되지 않은 경우 왜 검증해야합니까? – TheCloudlessSky

+0

@CloudlessSky 원본은 이제 업데이트 업데이트 ... 섹션으로 업데이트됩니다. – Tracker1

+0

나는 지금 무슨 뜻인지 안다. 아래 내 게시물을 참조하십시오. – TheCloudlessSky

답변

3

사용 :

var isOriginalModelValid = this.TryValidateModel(updated); 

은 아직도 당신이 생각이 몇 가지 근본적인 디자인 문제가있을 수 있습니다.

+0

나는 왜 이것이 작동하는지 이해하지 못한다. 아무도 왜이 작품을 설명 할 수 있습니까? CloudLessSky에 감사드립니다! –

+0

@Chris - [MVC 소스 코드] (http://aspnetwebstack.codeplex.com/SourceControl/latest#src/System.Web.Mvc/Controller.cs)에서 TryValidateModel의 소스를 확인하십시오. 'ModelMetadata'에 대한 각각의'ModelValidators'를 사용하여 지정된 모델을 검증 할 것입니다. – TheCloudlessSky

+0

고맙습니다 CloudLessSky - 매우 편리합니다! –

관련 문제