Ошибка сервера в приложении '/' Нет конструктора без параметров для этого объекта

Столбец показывает следующее:

[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 *********************, 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
</bindmodel>

У меня есть крошечная форма с кучей скрытых полей и одной кнопкой отправки. Когда я нажимаю на него, я даже не нажимаю запрошенный метод.

Как мне продолжить и отлаживать это? Это было бы отличным началом, если бы я знал, что объект WHAT не имеет конструктора без параметров. Где этот объект? Как я могу это решить? Я знаю, что вопрос довольно расплывчатый, но в настоящее время все, что у меня есть.

- EDIT - В моей форме я добавил Html.Hidden() входы. В зависимости от предыдущих действий они могут иметь значение ". Действие использует ModelBinding. Всякий раз, когда значение равно" ", а тип данных - это SelectList, модель-блендер меняет.

Мне все больше и больше неудобно с тем, как SelectList делает это... Идея хорошая, но есть некоторые проблемы с ней.

6 ответов

Я решил проблему, вызванную объектом SelectList, потому что она не предоставляет конструктор по умолчанию, поэтому мы не можем отобразить ViewModel.


Для этих Googling это исключение, вот более общий способ его диагностики:

Единственный простой способ найти эту проблему - переопределить MVC как можно ближе к исключению с вашим собственным кодом. Затем ваш код разрывается внутри Visual Studio, когда возникает это исключение, и вы можете прочитать Type, вызывающий проблему из трассировки стека.

Это кажется ужасным способом приблизиться к этой проблеме, но это очень быстро и очень непротиворечиво.

Например, если эта ошибка возникает внутри MVC DefaultModelBinder (которую вы узнаете, проверив трассировку стека), замените DefaultModelBinder на этот код:

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);
 }
}

И обновите свой файл Global.asax.cs:

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

В следующий раз, когда вы получите это исключение, Visual Studio остановится в вашем классе MyDefaultModelBinder, и вы можете проверить свойство "modelType", чтобы узнать, какой тип вызвал проблему.

Пример выше работает, когда вы получаете исключение "Без параметров без конструктора, определенного для этого объекта" только при привязке модели. Но аналогичный код можно записать для других точек расширения в MVC (например, для конструкции контроллера).


У меня также есть свойства класса my view, которые возвращают экземпляры SelectList. Я украсил свой класс атрибутом Bind, чтобы исключить эти свойства следующим образом:

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

public SelectList Countries { get; set; }

} Код >

Надеюсь, что это поможет, Роджер


В пользовательских классах в аргументах действий должен быть конструктор без параметров, чтобы использовать связующее устройство по умолчанию. В противном случае (1) создайте собственное связующее устройство или (2) передайте примитивные типы вместо пользовательских классов в Action.


Вы удалили Default.aspx? Это должно быть сделано, чтобы правильно отредактировать корень. Это также может произойти, если вы пытаетесь использовать Dependency Injection, и ваш контейнер не настроен должным образом - это означает, что ControllerFactory не запрашивает контейнер DI для экземпляра.


Корнем моей проблемы был также SelectList.

У меня было это:

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

Когда я должен был это сделать:

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

Назначение - это выбор пользователя, Destinations - список возможных значений. Использование множественного SelectList дважды вызвало проблему.

licensed under cc by-sa 3.0 with attribution.