2008-12-01 28 views
13

La pila de llamadas muestra lo siguiente:Error de servidor en la aplicación '/'. Sin constructor sin parámetros definidos para este objeto

[MissingMethodException: No parameterless constructor defined for this object.] 
System.RuntimeTypeHandle.CreateInstance(RuntimeType type, Boolean publicOnly, Boolean noCheck, Boolean& canBeCached, RuntimeMethodHandle& ctor, Boolean& bNeedSecurityCheck) +0 
System.RuntimeType.CreateInstanceSlow(Boolean publicOnly, Boolean fillCache) +86 
System.RuntimeType.CreateInstanceImpl(Boolean publicOnly, Boolean skipVisibilityChecks, Boolean fillCache) +230 
System.Activator.CreateInstance(Type type, Boolean nonPublic) +67 
System.Activator.CreateInstance(Type type) +6 
System.Web.Mvc.DefaultModelBinder.CreateModel(ModelBindingContext bindingContext, Type modelType) +277 
System.Web.Mvc.<>c__DisplayClass1.<BindModel>b__0() +98 
System.Web.Mvc.ModelBindingContext.get_Model() +51 
System.Web.Mvc.DefaultModelBinder.BindModelCore(ModelBindingContext bindingContext) +2600 
System.Web.Mvc.DefaultModelBinder.BindModel(ModelBindingContext bindingContext) +1067 
System.Web.Mvc.DefaultModelBinder.BindProperty(ModelBindingContext parentContext, Type propertyType, Func`1 propertyValueProvider, String propertyName) +208 
System.Web.Mvc.DefaultModelBinder.BindModelCore(ModelBindingContext bindingContext) +1787 
System.Web.Mvc.DefaultModelBinder.BindModel(ModelBindingContext bindingContext) +1067 
System.Web.Mvc.ControllerActionInvoker.GetParameterValue(ParameterInfo parameterInfo) +355 
System.Web.Mvc.ControllerActionInvoker.GetParameterValues(MethodInfo methodInfo) +439 
System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext, String actionName) +288 
System.Web.Mvc.Controller.ExecuteCore() +180 
System.Web.Mvc.ControllerBase.Execute(RequestContext requestContext) +96 
System.Web.Mvc.ControllerBase.System.Web.Mvc.IController.Execute(RequestContext requestContext) +36 
System.Web.Mvc.MvcHandler.ProcessRequest(HttpContextBase httpContext) +377 
System.Web.Mvc.MvcHandler.ProcessRequest(HttpContext httpContext) +71 
System.Web.Mvc.MvcHandler.System.Web.IHttpHandler.ProcessRequest(HttpContext httpContext) +36 
System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +181 
System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +75 

que tienen una forma pequeña, con un montón de campos ocultos y un botón de envío. Cuando lo presiono, ni siquiera toco el método solicitado.

¿Cómo puedo continuar y corregir esto? Sería un gran comienzo si supiera QUÉ objeto no tiene un constructor sin parámetros. ¿Dónde está este objeto? ¿Como puedo resolver esto? Sé que la pregunta es más bien vaga, pero en la actualidad es todo lo que tengo ..

--EDIT--
En mi formulario I añaden entradas Html.Hidden(). Dependiendo de acciones anteriores, estos pueden tener un valor de "". La acción hace uso de ModelBinding. Cada vez que el valor es "" y el tipo de datos es una lista de selección, el encuadernador se vuelve berzerk en mí.

Me siento cada vez más incómodo con la forma en que SelectList lo está haciendo ... La idea es buena, pero hay algunos problemas con ella.

+0

¿Cuál es la firma de la acción que esté tratando de invocar? –

+0

¿Agregaste parámetros al constructor de tu controlador o eliminaste el constructor predeterminado en tu controlador? –

+0

Todd, ese no es el problema. Mira la pila; el controlador ya ha sido creado. Es el modelo, probablemente uno de los argumentos para la acción. –

Respuesta

7

Resolví el problema causado por el objeto SelectList porque no proporciona el constructor predeterminado, por lo que no podemos tenerlo en ViewModel.

+0

Ic, gracias por la respuesta :) –

1

¿Eliminó Default.aspx? Eso debe estar en su lugar para renderizar la raíz correctamente. Esto también puede ocurrir si estás tratando de usar Inyección de Dependencia y tu contenedor no está configurado correctamente, lo que significa que no hay ControllerFactory que pregunte al Contenedor DI por la instancia.

+0

No, está allí. Encontré cuál es la causa, pero aún no la solución. Por favor, consulte mi publicación original. –

+1

Eso fue todo para mí, he copiado sobre el código de la aplicación WPF que estaba probando y me había quitado el IControllerFactory controllerFactory = \t \t \t \t \t nueva UnityControllerFactory (_container); \t \t \t ControllerBuilder.Current.SetControllerFactory (controllerFactory); – rball

6

Sus clases personalizadas en los argumentos de acción deben tener un constructor sin parámetros para poder usar el encuadernador de modelo predeterminado. De lo contrario, (1) cree una carpeta de modelo personalizada o (2) pase tipos primitivos en lugar de clases personalizadas a la Acción.

+0

Gracias por la respuesta. Esto fue en realidad lo primero que revisé porque era lo más obvio que podría salir mal. Ellos tienen un parles ctor. Uso los mismos objetos en todo el resto de mi sitio con éxito. –

6

También tengo propiedades en mi clase de modelo de vista que devuelven instancias de SelectList. He decorado mi clase con el atributo de enlace para excluir estas propiedades como esta:

[Bind(Exclude = "Countries")] public class MyViewModel { ...

public SelectList Countries { get; set; } 

}

Espero que ayude, Roger

+0

Entonces, los valores de la lista de selección deben recuperarse de la colección de formularios. –

+0

Esto me ayudó mucho. ¡Gracias! –

0

La raíz de mi problema también era SelectList.

Tenía esta:

<%: Html.DropDownListFor(m => Model.Destinations, Model.Destinations)%> 

cuando debería haber tenido esto:

<%: Html.DropDownListFor(m => Model.Destination, Model.Destinations)%> 

destino es la selección del usuario, Destinos es la lista de valores posibles. Usar el plural SelectList dos veces causó el problema.

7

Para aquellos googlear esta excepción, aquí es una manera más general para diagnosticarla:

La única forma que he encontrado fácil de diagnosticar este problema es para anular MVC lo más cerca posible excepción de lo posible con su propio código. Luego, su código se dividirá en Visual Studio cuando se produzca esta excepción, y podrá leer el Tipo que causa el problema en el seguimiento de la pila.

esto parece una horrible manera de abordar este problema, pero es muy rápido y muy consistente.

Por ejemplo, si este error se produce en el interior del MVC DefaultModelBinder (que usted sabrá comprobando el seguimiento de la pila), vuelva a colocar la DefaultModelBinder con este código:

public class MyDefaultModelBinder : System.Web.Mvc.DefaultModelBinder 
{ 
    protected override object CreateModel(System.Web.Mvc.ControllerContext controllerContext, System.Web.Mvc.ModelBindingContext bindingContext, Type modelType) 
    { 
     return base.CreateModel(controllerContext, bindingContext, modelType); 
    } 
} 

y actualizar su Global.asax. CS:

public class MvcApplication : System.Web.HttpApplication 
{ 
... 
    protected void Application_Start(object sender, EventArgs e) 
    { 
     ModelBinders.Binders.DefaultBinder = new MyDefaultModelBinder(); 
    } 
} 

Ahora, la próxima vez que reciba esa excepción, Visual Studio se detendrá dentro de su clase MyDefaultModelBinder, y se puede comprobar la propiedad "modelType" para ver qué tipo causó el problema.

El ejemplo anterior funciona para cuando llegue el "No constructor sin parámetros definidos para este objeto" durante modelo de unión, solamente. Pero se puede escribir un código similar para otros puntos de extensión en MVC (por ejemplo, construcción del controlador).

+0

He estado buscando esto durante mucho tiempo. ¡Gracias! Todos: ahorre tiempo y pruebe esto primero. Llamé a la mía "DebuggableModelBinder" y solo voy a comentarlo desde Global.asax.cs y dejarlo allí la próxima vez que me muerda. –

Cuestiones relacionadas