쿠키 문제에서 벗어나는 맞춤형 모델 바인더?
-
18-09-2019 - |
문제
나는 다음을하려고합니다.
기본 모델 바인더를 사용하여 쿼리 문자열 값에서 객체를 바인딩하십시오.
그것이 실패하면 쿠키 값에서 객체를 바인딩하려고합니다.
그러나이 객체에서 데이터 알노 테이션을 사용하고 있으며 다음과 같은 문제가 있습니다.
- QueryString 매개 변수가없는 경우 기본 모델 바인더는 필수 필드에 유효성 검사 오류를 등록하지 않습니다. 속성 자체가 쿼리 문자열 수집에 있지 않은 경우 이러한 유효성 검사기를 발사하지도 않습니다. 이 동작을 어떻게 바꿀 수 있습니까? 필요한 필드가 쿼리 문자열에 있지 않은 경우 오류가되기를 원합니다.
- 모델 유효성 검사 오류가 있으면 쿠키에서 모델을로드 한 다음 객체를 재평가하고 싶습니다. 모델 바인더를 얻는 방법을 잘 모르겠습니다.
여기에 내가 지금까지 가지고있는 것이 있습니다.
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;
}
}
}
제휴하지 않습니다 StackOverflow