문제

나는 다음을하려고합니다.

기본 모델 바인더를 사용하여 쿼리 문자열 값에서 객체를 바인딩하십시오.
그것이 실패하면 쿠키 값에서 객체를 바인딩하려고합니다.

그러나이 객체에서 데이터 알노 테이션을 사용하고 있으며 다음과 같은 문제가 있습니다.

  1. QueryString 매개 변수가없는 경우 기본 모델 바인더는 필수 필드에 유효성 검사 오류를 등록하지 않습니다. 속성 자체가 쿼리 문자열 수집에 있지 않은 경우 이러한 유효성 검사기를 발사하지도 않습니다. 이 동작을 어떻게 바꿀 수 있습니까? 필요한 필드가 쿼리 문자열에 있지 않은 경우 오류가되기를 원합니다.
  2. 모델 유효성 검사 오류가 있으면 쿠키에서 모델을로드 한 다음 객체를 재평가하고 싶습니다. 모델 바인더를 얻는 방법을 잘 모르겠습니다.

여기에 내가 지금까지 가지고있는 것이 있습니다.

    public class MyCarBinder : DefaultModelBinder
{
    public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        var myCar = base.BindModel(controllerContext, bindingContext);

        if (!bindingContext.ModelState.IsValid)
        {
            myCar = MyCar.LoadFromCookie();
            // Not sure what to do to revalidate
        }

        return myCar;
    }
}

올바르게 수행하는 방법에 대한 도움은 크게 감사하겠습니다.

도움이 되었습니까?

해결책

글쎄, 나는 그것을 직접 해결했다. 누구나 의견이 있거나 사용하고 싶은 경우 여기에 솔루션을 게시합니다.

 public class MyCarBinder : DefaultModelBinder
 {
    public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        var queryStringBindingContext = new ModelBindingContext()
        {
            FallbackToEmptyPrefix = bindingContext.FallbackToEmptyPrefix,
            ModelMetadata = bindingContext.ModelMetadata,
            ModelName = bindingContext.ModelName,
            PropertyFilter = bindingContext.PropertyFilter,
            ValueProvider = new QueryStringValueProvider(controllerContext),
            ModelState = new ModelStateDictionary()
        };

        var myCar = base.BindModel(controllerContext, queryStringBindingContext);

        if (queryStringBindingContext.ModelState.IsValid)
            return myCar;

        // try to bind from cookie if query string is invalid
        var cookieHelper = new Helpers.ControllerContextCookieHelper(controllerContext);
        NameValueCollection nvc = cookieHelper.GetCookies(Helpers.CookieName.MyCar);

        if (nvc == null)
        {
            bindingContext.ModelState.Merge(queryStringBindingContext.ModelState);
            return myCar;
        }

        var cookieBindingContext = new ModelBindingContext()
        {
            FallbackToEmptyPrefix = bindingContext.FallbackToEmptyPrefix,
            ModelMetadata = bindingContext.ModelMetadata,
            ModelName = bindingContext.ModelName,
            PropertyFilter = bindingContext.PropertyFilter,
            ValueProvider = new NameValueCollectionValueProvider(nvc, CultureInfo.InvariantCulture),
            ModelState = new ModelStateDictionary()
        };

        var myCarFromCookie = base.BindModel(controllerContext, cookieBindingContext);

        if (cookieBindingContext.ModelState.IsValid)
        {
            MyCar temp = myCarFromCookie as MyCar;
            if (temp != null)
                temp.FromCookie = true;

            return myCarFromCookie;
        }
        else
        {
            bindingContext.ModelState.Merge(queryStringBindingContext.ModelState);
            return myCar;
        }
    }
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top