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. [Примечание: это может быть отвлекающий маневр.]
после этого я больше не мог загружать свой проект. Вышеописанная ошибка остановила меня холодно.
У меня вопрос не "не могли бы вы помочь мне исправить мой код?"
вместо этого я хотелось бы знать в более общем плане:
- как я должен устранить эту проблему?
- что я должен искать?
- какова может быть первопричина?
похоже, я должен понимать маршрутизацию и контроллеры на более глубоком уровне, чем сейчас.
24 ответов:
у меня просто была похожая проблема. То же самое исключение происходит, когда
Modelне имеет конструктора без параметров.стек вызовов нашел способ отвечать за создание нового экземпляра модели.
Это также может быть вызвано, если ваша модель использует SelectList,так как это не имеет конструктора без параметров:
public class MyViewModel { public SelectList Contacts { get;set; } }вам нужно будет рефакторинг вашей модели, чтобы сделать это по-другому, если это является причиной. Так что с помощью
IEnumerable<Contact>и написание метода расширения, который создает выпадающий список с различными определениями собственность:public class MyViewModel { public Contact SelectedContact { get;set; } public IEnumerable<Contact> Contacts { get;set; } } public static MvcHtmlString DropDownListForContacts(this HtmlHelper helper, IEnumerable<Contact> contacts, string name, Contact selectedContact) { // Create a List<SelectListItem>, populate it, return DropDownList(..) }или вы можете использовать подход @Mark и @krilovich, просто нужно заменить SelectList на IEnumerable, это работает с MultiSelectList тоже.
public class MyViewModel { public Contact SelectedContact { get;set; } public IEnumerable<SelectListItem> Contacts { get;set; } }
вам нужно действие, которое соответствует контроллеру, чтобы не иметь параметра.
похоже, что для комбинации контроллера / действия у вас есть:
public ActionResult Action(int parameter) { }а нужно
public ActionResult Action() { }кроме того, проверьте Фила Хаака Отладчик Маршруту для устранения маршруты.
по умолчанию контроллеры MVC требуют конструктора по умолчанию без параметров. Проще всего было бы сделать конструктор по умолчанию, который вызывает один с параметрами:
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.<BeginProcessRequest>b__2() +49 System.Web.Mvc.<>c__DisplayClassb`1.<ProcessInApplicationTrust>b__a() +13 System.Web.Mvc.SecurityUtil.<GetCallInAppTrustThunk>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 (например, он не может создать контроллер, или он не может создать модель, чтобы дать этот контроллер).
Это похоже ужасный способ подойти к этой проблеме, но это очень быстро, и очень последовательны.
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); } }и обновить глобальный.асакс.cs:
public class MvcApplication : System.Web.HttpApplication { ... protected void Application_Start(object sender, EventArgs e) { ModelBinders.Binders.DefaultBinder = new MyDefaultModelBinder(); } }теперь в следующий раз, когда вы получите это исключение, Visual Studio остановится внутри вашего класса MyDefaultModelBinder, и вы можете проверить "modelType" свойство, чтобы увидеть, какой тип вызвал проблему.
приведенный выше пример работает, когда вы получаете исключение "no parameterless constructor defined for this object" только во время привязки модели. Но аналогичный код может быть написан для других точек расширения в MVC (например, конструкция контроллера).
Я получил ту же ошибку, виновником в моем случае был конструктор, который не было ни публичным, ни частным.
для этого объекта не определен конструктор без параметров.
Сведения Об Исключении: System.Исключения missingmethodexception: нет конструктора без параметров, определенных для данного объекта.
код повтора: убедитесь, что конструктор имеет public перед ним.
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 по умолчанию. Т. е. создать структуру Map controller factory.
в принципе, вы, вероятно, пытаетесь реализовать инъекцию зависимостей??
проблема в том, что это зависимость интерфейс.
я получил ту же ошибку, когда:
используя пользовательский ModelView, оба действия (GET и POST) передавали ModelView, который содержал два объекта:
public ActionResult Add(int? categoryID) { ... ProductViewModel productViewModel = new ProductViewModel( product, rootCategories ); return View(productViewModel); }и сообщение также принимает тот же вид модели:
[HttpPost] [ValidateInput(false)] public ActionResult Add(ProductModelView productModelView) {...}проблема была в том, что представление получило ModelView (необходим как продукт, так и список категорий информации), но после отправки возвращал только объект продукта, но поскольку сообщение Add ожидало ProductModelView, он передал NULL, но затем ProductModelView только конструктор нуждался в двух параметрах (Product, RootCategories), затем он попытался найти другой конструктор без параметров для этого нулевого случая, а затем потерпел неудачу с "no parameterles..."
Итак, исправляя сообщение добавить следующим образом исправить проблему:
[HttpPost] [ValidateInput(false)] public ActionResult Add(Product product) {...}надеюсь, что это может помочь кому-то (я потратил почти полдня, чтобы выяснить это!).
то же самое для меня. Моя проблема появилась, потому что я забыл, что мой класс базовой модели уже имеет свойство с именем, которое было определено в представлении.
public class CTX : DbContext { // context with domain models public DbSet<Products> Products { get; set; } // "Products" is the source property public CTX() : base("Entities") {} } public class BaseModel : CTX { ... } public class ProductModel : BaseModel { ... } public class OrderIndexModel : OrderModel { ... }... и модель обработки контроллера:
[HttpPost] [ValidateInput(false)] public ActionResult Index(OrderIndexModel order) { ... }ничего особенного, верно? Но потом я определяю вид ...
<div class="dataItem"> <%=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")%> </div>... что вызывает ошибку "конструктор без параметров" при запросе POST.
надеюсь, что это поможет.
У меня была аналогичная проблема, и в основном дело в том, что в методе действия есть некоторые аргументы, которые не были предоставлены процессом привязки модели (другими словами, эти поля не были представлены на странице отправки).
эта проблема возникнет, даже если все аргументы, кроме одного, будут предоставлены, и даже если один отсутствует, является типом nullable.
проблема также может быть результатом опечатки, в которой имя аргумента и имя формы поле не будет идентичным.
решение состоит в том, чтобы 1) проверить, что имена совпадают 2) предоставить значение по умолчанию для аргумента 3) или предоставить другой метод действия без этого аргумента.
у меня тоже была эта проблема, и я подумал, что поделюсь, так как я не могу найти свою проблему выше.
Это был мой код
return RedirectToAction("Overview", model.Id);вызов этого ActionResult:
public ActionResult Overview(int id)я предположил, что было бы достаточно умно выяснить, что значение, которое я передаю, является параметром id для обзора, но это не так. Это исправило его:
return RedirectToAction("Overview", new {id = model.Id});
Я получил такое же исключение из-за того, что не было parameterless public contructor
код был такой:
public class HomeController : Controller { private HomeController() { _repo = new Repository(); }изменено на
public class HomeController : Controller { public HomeController() { _repo = new Repository(); }проблема решена для меня.
У меня была та же проблема...
Если вы используете интерфейс для разъединения вашего соединения с вашим DbContext (как и я), вы можете использовать structuremap.mvc(3 или 4 - nudget package), чтобы иметь возможность использовать конструкцию в вашем классе контроллера. Это даст вам папку DependencyResolution. Просто измените комментируемую строку с помощью For () и используйте().
хотя это может быть очевидно для некоторых, виновником этой ошибки для меня был мой метод MVC был привязан к модели, которая содержала свойство типа
Tuple<>.Tuple<>не имеет конструктора без параметров.
все ответы говорят о создании конструктора параметров less, который не идеален, если вы не хотите, чтобы его использовали другие разработчики и только связыватель модели.
атрибут
[Obsolete("For model binding only", true)]над публичным конструктором появится ошибка компилятора, если другой разработчик попытается использовать это. Мне потребовались годы, чтобы найти это, надеюсь, это поможет кому-то.
Я получил эту ошибку. Я использовал интерфейсы в своем конструкторе, и мой решатель зависимостей не смог решить, когда я зарегистрировал его, тогда ошибка ушла.
эта ошибка началась для меня, когда я добавил новый способ для создания экземпляра класса.
пример:
public class myClass { public string id{ get; set; } public List<string> myList{get; set;} // error happened after I added this public myClass(string id, List<string> lst) { this.id= id; this.myList= lst; } }ошибка была устранена, когда я добавил, Когда я сделал это изменение, добавление конструктора без параметров. Я считаю, что компилятор по умолчанию создает беспараметрический констуктор, но если вы добавляете свой собственный, то вы должны явно создать его.
public class myClass { public string id{ get; set; } public List<string> 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<string> lst) { this.id= id; this.myList= lst; } }
я добавил
DropDownListк моей форме, однако в моем случае он не был (и не был предназначен) представлен с формой, как это было за пределами<form></form>теги:@Html.DropDownList("myField", Model.MyField)поскольку модель содержала поле только для отображения, это также вызвало
No parameterless constructor defined for this objectошибка, потому что поле не было отправлено вообще.в этом случае я исправил его, добавив привязку exclude:
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){}
скорее всего, у вас может быть параметризованный конструктор в контроллере, и независимо от того, какой решатель зависимостей вы используете, он не может правильно разрешить зависимость. Вам нужно поставить точку останова, где записан метод решателя зависимостей, и вы получите точную ошибку во внутреннем исключении.
У меня была та же проблема, но позже я обнаружил, что добавление любого нового интерфейса и соответствующего класса требует его регистрации в разделе Initializable Module for dependency injection. В моем случае это был внутренний код следующим образом:
[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<IAppSettingService>().Use<AppSettingService>(); container.For<ISiteSettingService>().Use<SiteSettingService>(); container.For<IBreadcrumbBuilder>().Use<BreadcrumbBuilder>(); container.For<IFilterContentService>().Use<FilterContentService>().Singleton(); container.For<IDependecyFactoryResolver>().Use<DependecyFactoryResolver>(); container.For<IUserService>().Use<UserService>(); container.For<IGalleryVmFactory>().Use<GalleryVmFactory>(); container.For<ILanguageService>().Use<LanguageService>(); container.For<ILanguageBranchRepository>().Use<LanguageBranchRepository>(); container.For<ICacheService>().Use<CacheService>(); container.For<ISearchService>().Use<SearchService>(); container.For<IReflectionService>().Use<ReflectionService>(); container.For<ILocalizationService>().Use<LocalizationService>(); container.For<IBookingFormService>().Use<BookingFormService>(); container.For<IGeoService>().Use<GeoService>(); container.For<ILocationService>().Use<LocationService>(); RegisterEnterpriseAPIClient(container); } public void Initialize(InitializationEngine context) { } public void Uninitialize(InitializationEngine context) { } public void Preload(string[] parameters) { } }}
у меня была та же проблема.
Просто Удалены
HttpFileCollectionBase filesиз аргумента метода действия Post и добавил:HttpFileCollectionBase files = Request.Files;в тело метода.
Так что я получил это сообщение и раньше, при выполнении вызова ajax. Поэтому то, что он в основном просит, - это конструктор в этом классе модели, который вызывается contoller, не имеет никакого параметра.
вот пример
public class MyClass{ public MyClass(){} // so here would be your parameterless constructor }
Comments