Ошибка сервера в приложении '/' Для этого объекта не определен конструктор без параметров - PullRequest
13 голосов
/ 01 декабря 2008

В стеке вызовов показано следующее:

[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

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

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

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

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

Ответы [ 6 ]

7 голосов
/ 08 марта 2013

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

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

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

Например, если эта ошибка происходит внутри 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 (например, конструкция контроллера).

7 голосов
/ 05 марта 2009

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

6 голосов
/ 25 августа 2009

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

[Bind(Exclude = "Countries")] public class MyViewModel { ...</p> <pre><code>public SelectList Countries { get; set; }

}

Надеюсь, это поможет, Roger

6 голосов
/ 01 декабря 2008

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

1 голос
/ 01 декабря 2008

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

0 голосов
/ 11 ноября 2011

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

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...