programing

컨트롤러 메서드 내에서 수정 된 ViewModel을 재 검증 하시겠습니까?

copyandpastes 2021. 1. 17. 12:30
반응형

컨트롤러 메서드 내에서 수정 된 ViewModel을 재 검증 하시겠습니까?


편집 -우리는 MVC4 Dev Preview를 사용하고 있습니다 ....

FishingTrip클래스에 대한 편집 페이지를 구현하고 있습니다. FishingTrip간단한 Crew개체 (예 : FishingTripID, CrewID, CrewPosition) 의 자식 컬렉션을 포함합니다 .

컬렉션 에서 추가, 편집 및 삭제 하는 데 Jarrett Meyer의 접근 방식사용 하고 Crew있습니다. 의 속성 Crew이 모두 라는 것을 지정하기 위해 눈에 잘 띄지 않는 유효성 검사를 사용하고 있습니다 Required.

내 문제 : 목록에서 항목을 논리적으로 삭제할 때 (Jarrett의 방법에 따라) 해당 항목이 확인되는 것을 원하지 않습니다.

클라이언트 측에서 "removeRow"메서드를 성공적으로 조정하여 논리적으로 삭제 된 항목에 대해 눈에 띄지 않는 유효성 검사를 비활성화하여 빈 필드가 포함 된 항목이 있어도 양식이 게시되도록했습니다.

내 컨트롤러 메서드 [HttpPost] Edit에서 ModelState.IsValid(예상대로-빈 필드를 포함하는 논리적으로 삭제 된 항목 때문에) false로 시작합니다. 따라서 내 ViewModel에서 해당 항목을 제거합니다 ....하지만 ModelState.IsValid여전히 false입니다.

요약하면 컨트롤러 메서드 내에서 ViewModel을 수정하여 문제가되는 항목을 제거한 다음 일종의 "재 검증"을 호출 ModelState.IsValid하고 true로 표시하고 싶습니다 .

어떤 아이디어?


문제가되는 항목을 제거한 후에는 ModelState를 지우고 다음과 같이 다시 확인합니다.

ModelState.Clear();
TryValidateModel(crew);  // assumes the model being passed is named "crew"

참고 : TryValidateModel이 메서드는 모델의 중첩 된 개체를 확인하지 않으므로 메서드를 사용할 때주의해야 합니다 (@Merenzo에서 언급 함).


게임에 늦었지만 여전히 : 모델 을 약간 조정 한 후 (더 정확하게는 중첩 된 컬렉션의 항목에 대해) 모델의 유효성을 검사하는 방법을 찾고 있었지만 TryValidateModel작동하지 않았습니다. 중첩 된 개체를 처리합니다.

마지막으로 사용자 지정 모델 바인더로 해결했습니다.

public class MyItemModelBinder : DefaultModelBinder
{
    protected override void OnModelUpdated(
        ControllerContext controllerContext, 
        ModelBindingContext bindingContext)
    {
        if (bindingContext.ModelType == typeof(MyItemModel))
        {
            MyItemModel item = (MyItemModel)bindingContext.Model;
            //do required tweaks on model here 
            //(I needed to load some additional data from DB)
        }
        //validation code will be called here, in OnModelUpdated implementation
        base.OnModelUpdated(controllerContext, bindingContext);
    }
}

모델 클래스 :

[ModelBinder(typeof(MyItemModelBinder))]
public class MyItemModel : IValidatableObject
{
    //...
}

참조 URL : https://stackoverflow.com/questions/7833396/revalidating-a-modified-viewmodel-within-a-controller-method

반응형