Esto está mal en muchos niveles en mi humilde opinión:
- Esto no es como ASP.NET MVC está diseñado para trabajar.
- Sus acciones no definen un contrato claro de qué datos esperan.
- ¿Qué obtienes de él? Huele a mal diseño.
El encuadernado del modelo es conducido por la reflexión. Antes de invocar una acción, reflejará la lista de parámetros del método y para cada objeto y sus propiedades invocará un enlace de modelo para encontrar un valor para cada propiedad de los diversos proveedores de valor (formulario proveedor de valores POST, parámetros de url, etc.). Durante el enlace del modelo, también se realiza la validación de ModelState.
Así que al no utilizar el ASP.NET MVC predeterminado para hacer esto, está perdiendo todo eso.
Incluso si tuviera que conseguir manualmente bodega de un aglutinante de modelo así:
IModelBinder modelBinder = ModelBinders.Binders.GetBinder(typeof(MyObject));
MyObject myObject = (MyObject) modelBinder.BindModel(this.ControllerContext, ** ModelBindingContext HERE**);
se puede ver que es necesario inicializar un ModelBindingContext, algo que ASP.NET MVC se hará basado internamente en el actual propiedad que está reflejando. Aquí está la cortada con tijeras a partir del código fuente de 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;
}
'¿Qué obtienes de él? Huele a mal diseño. Parece un mal diseño para vincularse a múltiples tipos de modelos, pero tiene un buen uso de rendimiento. Puede inyectar todo lo que se inicializa inicialmente, luego hacer una cláusula de guardia y regresar temprano, sin usar los objetos inyectados que se han configurado. O bien, después de las cláusulas de guardia, una vez que esté seguro de que desea usar un objeto, haga que 'UpdateModel' resuelva la dependencia. Es desordenado, pero si debe hacer que el diseño cambie por el rendimiento, es una posibilidad. – StuperUser