Это неправильно на многих уровнях ИМХО:
- Это не то, как 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, то, что ASP.NET MVC будет делать внутренне на основе текущего свойства, которое он отражает.Вот фрагмент исходного кода 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;
}