ASP.NET MVC: для этого объекта не задан конструктор без параметров

Server Error in '/' Application. -------------------------------------------------------------------------------- No parameterless constructor defined for this object. Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. Exception Details: System.MissingMethodException: No parameterless constructor defined for this object. Source Error: Line 16: HttpContext.Current.RewritePath(Request.ApplicationPath, false); Line 17: IHttpHandler httpHandler = new MvcHttpHandler(); Line 18: httpHandler.ProcessRequest(HttpContext.Current); Line 19: HttpContext.Current.RewritePath(originalPath, false); Line 20: } 

Я следовал за « Pro ASP.NET MVC Framework » Стивена Сандерсона. На стр. 132, в соответствии с рекомендацией автора, я загрузил сборку ASP.NET MVC Futures и добавил ее в мой проект MVC. [Примечание: это может быть красная селедка.]

После этого я больше не мог загружать свой проект. Вышеприведенная ошибка остановила меня.

Мой вопрос не в том , «Не могли бы вы помочь мне исправить свой код?»

Вместо этого я хотел бы узнать больше:

  • Как устранить эту проблему?
  • Что я должен искать?
  • Что может быть причиной?

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

У меня была аналогичная проблема. Такое же исключение возникает, когда Model не имеет конструктора без параметров.

В стеке вызовов вычислялся метод, отвечающий за создание нового экземпляра модели.

System.Web.Mvc.DefaultModelBinder. CreateModel (ControllerContext controllerContext, ModelBindingContext bindingContext, Тип modelType)


Вот пример:

 public class MyController : Controller { public ActionResult Action(MyModel model) { } } public class MyModel { public MyModel(IHelper helper) // MVC cannot call that { // ... } public MyModel() // MVC can call that { } } 

Это также может быть вызвано, если ваша модель использует SelectList, поскольку у этого нет конструктора без параметров :

 public class MyViewModel { public SelectList Contacts { get;set; } } 

Вам нужно будет реорганизовать вашу модель, чтобы сделать это по-другому, если это причина. Поэтому с помощью IEnumerable и написания метода расширения, который создает раскрывающийся список с различными определениями свойств:

 public class MyViewModel { public Contact SelectedContact { get;set; } public IEnumerable Contacts { get;set; } } public static MvcHtmlString DropDownListForContacts(this HtmlHelper helper, IEnumerable contacts, string name, Contact selectedContact) { // Create a List, populate it, return DropDownList(..) } 

Или вы можете использовать подход @Mark и @krilovich, просто нужно заменить SelectList на IEnumerable, он также работает с MultiSelectList.

  public class MyViewModel { public Contact SelectedContact { get;set; } public IEnumerable Contacts { get;set; } } 

Вам нужно, чтобы действие, соответствующее controllerу, не имело параметра.

Похоже, что у controllerа / комбинации действий у вас есть:

 public ActionResult Action(int parameter) { } 

но вам нужно

 public ActionResult Action() { } 

Кроме того, проверьте Отладка маршрута Фила Хака для устранения неполадок маршрутов.

По умолчанию для MVC-controllerов требуется конструктор по умолчанию без параметров. Самым простым было бы создать конструктор по умолчанию, который вызывает тот, у которого есть параметры:

 public MyController() : this(new Helper()) { } public MyController(IHelper helper) { this.helper = helper; } 

Однако вы можете переопределить эту функциональность, скопировав собственный ControllerFactory . Таким образом, вы можете сказать MVC, что при создании MyController дайте ему экземпляр Helper .

Это позволяет использовать фреймворки зависимостей с MVC и действительно разделить все. Хороший пример этого – на веб-сайте StructureMap . Весь быстрый старт хорош, и он привязывается к MVC ближе к «Auto Wiring».

Эта ошибка также возникает при использовании IDependencyResolver , например при использовании контейнера IoC, и преобразователь зависимостей возвращает значение null. В этом случае ASP.NET MVC 3 по умолчанию использует DefaultControllerActivator для создания объекта. Если создаваемый объект не имеет открытого конструктора no-args, исключение будет вызываться в любое время, когда предоставленный зависимый преобразователь возвращает null.

Вот одна такая трассировка стека:

 [MissingMethodException: No parameterless constructor defined for this object.] System.RuntimeTypeHandle.CreateInstance(RuntimeType type, Boolean publicOnly, Boolean noCheck, Boolean& canBeCached, RuntimeMethodHandleInternal& ctor, Boolean& bNeedSecurityCheck) +0 System.RuntimeType.CreateInstanceSlow(Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache) +98 System.RuntimeType.CreateInstanceDefaultCtor(Boolean publicOnly, Boolean skipVisibilityChecks, Boolean skipCheckThis, Boolean fillCache) +241 System.Activator.CreateInstance(Type type, Boolean nonPublic) +69 System.Web.Mvc.DefaultControllerActivator.Create(RequestContext requestContext, Type controllerType) +67 [InvalidOperationException: An error occurred when trying to create a controller of type 'My.Namespace.MyController'. Make sure that the controller has a parameterless public constructor.] System.Web.Mvc.DefaultControllerActivator.Create(RequestContext requestContext, Type controllerType) +182 System.Web.Mvc.DefaultControllerFactory.GetControllerInstance(RequestContext requestContext, Type controllerType) +80 System.Web.Mvc.DefaultControllerFactory.CreateController(RequestContext requestContext, String controllerName) +74 System.Web.Mvc.MvcHandler.ProcessRequestInit(HttpContextBase httpContext, IController& controller, IControllerFactory& factory) +232 System.Web.Mvc.<>c__DisplayClass6.b__2() +49 System.Web.Mvc.<>c__DisplayClassb`1.b__a() +13 System.Web.Mvc.SecurityUtil.b__0(Action f) +7 System.Web.Mvc.SecurityUtil.ProcessInApplicationTrust(Action action) +22 System.Web.Mvc.SecurityUtil.ProcessInApplicationTrust(Func`1 func) +124 System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContextBase httpContext, AsyncCallback callback, Object state) +98 System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContext httpContext, AsyncCallback callback, Object state) +50 System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.BeginProcessRequest(HttpContext context, AsyncCallback cb, Object extraData) +16 System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +8963444 System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +184 

Вы можете получить это исключение во многих разных местах в среде MVC (например, он не может создать controller или не может создать модель для предоставления этого controllerа).

Единственный простой способ найти эту проблему – переопределить 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 остановится в вашем classе MyDefaultModelBinder, и вы можете проверить свойство «modelType», чтобы узнать, какой тип вызвал проблему.

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

Я получил ту же ошибку, виновником в моем случае был конструктор, который не был ни публичным, ни частным .

Для этого объекта не определен конструктор без параметров.

Сведения об исключении: System.MissingMethodException: для этого объекта не задан конструктор без параметров.

Код Repro: убедитесь, что конструктор открыт для него.

 public class Chuchi() { Chuchi() // The problem is this line. Public is missing { // initialization name="Tom Hanks"; } public string name { get; set; } } 

Первое видео на http://tekpub.com/conferences/mvcconf

47:10 минут показывают ошибку и показывают, как переопределить стандартный ControllerFactory. Т.е. создать фабрику controllerа структуры.

В принципе, вы, вероятно, пытаетесь внедрить инъекцию зависимостей?

Проблема в том, что это зависимость интерфейса.

Я получил ту же ошибку, когда:

Используя пользовательский ModelView, оба действия (GET и POST) передавали ModelView, который содержал два объекта:

 public ActionResult Add(int? categoryID) { ... ProductViewModel productViewModel = new ProductViewModel( product, rootCategories ); return View(productViewModel); } 

И POST также принимает тот же вид модели:

 [HttpPost] [ValidateInput(false)] public ActionResult Add(ProductModelView productModelView) {...} 

Проблема заключалась в том, что View получил ModelView (нужен как продукт, так и список категорий), но после отправки возвращался только объект Product, но, поскольку POST добавляет, что ProductModelView передал NULL, но тогда только конструктору ProductModelView нужны два параметра ( Продукт, RootCategories), то он попытался найти другой конструктор без параметров для этого случая NULL, а затем с «no parameters …»

Итак, исправление POST Add следующим образом исправляет проблему:

 [HttpPost] [ValidateInput(false)] public ActionResult Add(Product product) {...} 

Надеюсь, это может помочь кому-то (я потратил почти полдня, чтобы узнать это!).

То же самое для меня. Моя проблема возникла из-за того, что я забыл, что мой базовый class модели уже имеет свойство с именем, которое было определено в представлении .

 public class CTX : DbContext { // context with domain models public DbSet Products { get; set; } // "Products" is the source property public CTX() : base("Entities") {} } public class BaseModel : CTX { ... } public class ProductModel : BaseModel { ... } public class OrderIndexModel : OrderModel { ... } 

… и модель обработки controllerа:

 [HttpPost] [ValidateInput(false)] public ActionResult Index(OrderIndexModel order) { ... } 

Ничего особенного, не так ли? Но тогда я определяю представление …

 
<%=Html.Label("Products")%> <%=Html.Hidden("Products", Model.index)%> // I FORGOT THAT I ALREADY HAVE PROPERTY CALLED "Products" <%=Html.DropDownList("ProductList", Model.products)%> <%=Html.ActionLink("Delete", "D")%>

… который вызывает ошибку «Parameterless constructor» при запросе POST.

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

У меня была аналогичная проблема, и в основном дело в том, что в методе действий есть некоторые аргументы, которые не были предоставлены процессом привязки модели (иными словами, эти поля не были отправлены на странице отправки).

Эта проблема возникнет, даже если все аргументы, кроме одного, будут предоставлены, и даже если отсутствующий будет типом с нулевым значением.

Проблема также может быть результатом опечатки, в которой имя аргумента и имя поля формы не будут идентичными.

Решение состоит в том, чтобы: 1) убедиться, что имена совпадают 2) предоставить значение по умолчанию для аргумента 3) или предоставить другой метод действия без этого аргумента.

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

Это был мой код

return RedirectToAction("Overview", model.Id);

Вызов этого ActionResult:

public ActionResult Overview(int id)

Я предположил, что это было бы достаточно разумно, чтобы понять, что значение, которое я передаю, это идентификатор для Обзор, но это не так. Это фиксировало это:

return RedirectToAction("Overview", new {id = model.Id});

Я получил такое же исключение из-за отсутствия беззалогового общественного контрмера

Код был следующим:

 public class HomeController : Controller { private HomeController() { _repo = new Repository(); } 

изменился на

  public class HomeController : Controller { public HomeController() { _repo = new Repository(); } 

проблема решена для меня.

У меня такая же проблема…

Если вы используете интерфейс для развязки своего соединения с вашим DbContext (например, я), вы можете использовать structmap.mvc (3 или 4 – nudget package ), чтобы иметь возможность использовать структуру в classе controllerа. Это даст вам папку DependencyResolution. Просто измените прокомментированную строку с помощью параметра <Интерфейс кластера> () и используйте ().

Хотя это может быть очевидным для некоторых, виновником этой ошибки для меня был мой MVC-метод, который был привязан к модели, которая содержала свойство типа Tuple<> . Tuple<> не имеет конструктора без параметров.

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

Атрибут [Obsolete("For model binding only", true)] над публичным конструктором вызовет ошибку компилятора, если другой разработчик попытается использовать это. Взял меня, чтобы найти это, надеюсь, что это поможет кому-то.

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

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

Пример:

  public class myClass { public string id{ get; set; } public List myList{get; set;} // error happened after I added this public myClass(string id, List lst) { this.id= id; this.myList= lst; } } 

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

  public class myClass { public string id{ get; set; } public List myList{get; set;} // error doesn't happen when I add this public myClass() { } // error happened after I added this, but no longer happens after adding above public myClass(string id, List lst) { this.id= id; this.myList= lst; } } 

Я добавил DropDownList в свою форму, однако в моем случае это не было (и не предназначалось), представленное с формой, поскольку оно было вне тегов

:

 @Html.DropDownList("myField", Model.MyField) 

Так как модель содержала поле только для отображения, это также No parameterless constructor defined for this object ошибки No parameterless constructor defined for this object потому что поле вообще не было отправлено.

В этом случае я исправил это, добавив привязку исключения:

 public ActionResult Foo(int id, int? page, [Bind(Exclude = "MyField")]MyModel model) 

Это случилось со мной, и результаты на этой странице были хорошим ресурсом, который привел меня во многих направлениях, но я хотел бы добавить еще одну возможность:

Как указано в других ответах, создание конструктора с параметрами удаляет неявный конструктор без параметров, поэтому вы должны явно ввести его.

В чем была моя проблема: конструктор с параметрами по умолчанию также вызвал это исключение.

Дает ошибки:

 public CustomerWrapper(CustomerDto customer = null){...} 

Работает:

 public CustomerWrapper(CustomerDto customer){...} public CustomerWrapper():this(null){} 

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

У меня была такая же проблема, но позже было найдено добавление нового интерфейса, и соответствующий class требует, чтобы он был зарегистрирован в разделе Initializable Module для инъекции зависимостей. В моем случае это было внутри кода следующим образом:

 [InitializableModule] [ModuleDependency(typeof(EPiServer.Web.InitializationModule))] public class DependencyResolverInitialization : IConfigurableModule { public void ConfigureContainer(ServiceConfigurationContext context) { context.Container.Configure(ConfigureContainer); var structureMapDependencyResolver = new StructureMapDependencyResolver(context.Container); DependencyResolver.SetResolver(structureMapDependencyResolver); GlobalConfiguration.Configuration.Services.Replace(typeof(IHttpControllerActivator), structureMapDependencyResolver); } private void ConfigureContainer(ConfigurationExpression container) { container.For().Use(); container.For().Use(); container.For().Use(); container.For().Use().Singleton(); container.For().Use(); container.For().Use(); container.For().Use(); container.For().Use(); container.For().Use(); container.For().Use(); container.For().Use(); container.For().Use(); container.For().Use(); container.For().Use(); container.For().Use(); container.For().Use(); RegisterEnterpriseAPIClient(container); } public void Initialize(InitializationEngine context) { } public void Uninitialize(InitializationEngine context) { } public void Preload(string[] parameters) { } } 

}

У меня такая же проблема.

Просто HttpFileCollectionBase files из аргумента метода Post Action и добавил как HttpFileCollectionBase files = Request.Files; в способе корпус.

Поэтому я также получил это сообщение, когда делаю вызов ajax. Так что в основном он запрашивает конструктор в том classе модели, который вызывается контоллером, не имеет никакого параметра.

Вот пример

 public class MyClass{ public MyClass(){} // so here would be your parameterless constructor } 
Давайте будем гением компьютера.