이 많은 수준 이럴에 잘못 :
- 이 ASP.NET MVC가 작동하도록 설계 방법이 아니다.
- 귀하의 행동은 그들이 기대하는 데이터에 대한 분명한 계약을 정의하지 않습니다.
- 무엇에서 벗어나나요? 나쁜 디자인 같은 냄새.
모델 바인딩은 리플렉션에 의해 결정됩니다. 액션이 호출되기 전에 메서드 매개 변수 목록이 반영되고 각 객체와 속성에 대해 모델 바인더를 호출하여 다양한 값 공급자 (양식 POST 값 공급자, URL 매개 변수 등)의 각 속성 값을 찾습니다. 모델 바인딩 중에 ModelState 유효성 검사도 수행됩니다.
그래서 기본 ASP.NET MVC를 사용하지 않으면이 모든 것을 잃게됩니다.
IModelBinder modelBinder = ModelBinders.Binders.GetBinder(typeof(MyObject));
MyObject myObject = (MyObject) modelBinder.BindModel(this.ControllerContext, ** ModelBindingContext HERE**);
당신은 당신이 ModelBindingContext을 initalize 할 필요가 있음을 알 수 뭔가 ASP.NET MVC는 내부적으로 현재를 기반으로 할 것입니다 : 당신이 수동으로 같은 모델 바인더를 잡아하더라도
그것을 반영하는 속성.
protected virtual object GetParameterValue(ControllerContext controllerContext, ParameterDescriptor parameterDescriptor) {
// collect all of the necessary binding properties
Type parameterType = parameterDescriptor.ParameterType;
IModelBinder binder = GetModelBinder(parameterDescriptor);
IDictionary<string, ValueProviderResult> valueProvider = controllerContext.Controller.ValueProvider;
string parameterName = parameterDescriptor.BindingInfo.Prefix ?? parameterDescriptor.ParameterName;
Predicate<string> propertyFilter = GetPropertyFilter(parameterDescriptor);
// finally, call into the binder
ModelBindingContext bindingContext = new ModelBindingContext() {
FallbackToEmptyPrefix = (parameterDescriptor.BindingInfo.Prefix == null), // only fall back if prefix not specified
ModelName = parameterName,
ModelState = controllerContext.Controller.ViewData.ModelState,
ModelType = parameterType,
PropertyFilter = propertyFilter,
ValueProvider = valueProvider
};
object result = binder.BindModel(controllerContext, bindingContext);
return result;
}
'무엇부터 빠져 나갑니? 나쁜 디자인 같은 냄새가 풍긴다. "여러 모델 유형에 바인딩하기에는 좋지 않은 디자인 같지만 성능이 좋다. 초기화 된 모든 객체를 주입 할 수 있습니다. 그런 다음 설정 한 주입 객체를 사용하지 않고 가드 절을 사용하여 일찍 반환 할 수 있습니다. 또는, 가드 절 이후에 객체를 사용하기를 원한다면,'UpdateModel'이 의존성을 해결하게하십시오. 지저분하지만, 성능을 위해 디자인 거래를해야한다면 가능성이 있습니다. – StuperUser