ASP.NET MVC: для цього об'єкта не визначений конструктор без параметрів


172
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. [Примітка. Це може бути червона оселедець.]

Після цього я вже не міг завантажувати свій проект. Вищеописана помилка зупинила мене холодно.

Моє запитання не так : "Не могли б ви допомогти мені виправити свій код?"

Натомість я хотів би знати більш загально:

  • Як мені вирішити цю проблему?
  • Що я повинен шукати?
  • Що може бути першопричиною?

Здається, я повинен розуміти маршрутизацію та контролери на більш глибокому рівні, ніж зараз.

Відповіді:


226

У мене просто була подібна проблема. Такий самий виняток виникає, коли a Modelне має конструктора без параметрів.

Стек викликів був фігурою методу, відповідального за створення нового примірника моделі.

System.Web.Mvc.DefaultModelBinder. CreateModel (контролер ControllerContextContext, прив'язка ModelBindingContextContext, Type typeType)


Ось зразок:

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
    {
    }
}

16
Під час розміщення даних JSON в моїй дії я отримував подібну помилку. Виявляється, моя модель, до якої вона намагається зв'язатись, не має конструктора без параметрів!
Тім

1
Примітка: У мене є ця проблема (без параметра без бла-бла ...) під час серіалізації лише тоді, коли я визначаю конструктор, а не прилад без параметрів. Я маю на увазі, що в цьому прикладі, якщо ви видалите визначений вами конструктор (public MyModel (помічник IHelper) {}), проблема зникає ... тому кожен раз, коли ви створюєте конструктор, ви повинні створити параметр, який я не можу ... Я можу зрозуміти що на кшталт: щойно ви починаєте визначати конструктор, система не ризикує створити "об'єкти за замовчуванням", оскільки не знає, чи має сенс ... щось подібне.
H_He

1
Кортежі ... можливо для інших людей, які приходять сюди: якщо у вас у класі просто кортежі (наприклад, Tuple <string, string> data;), серіалізація буде нормальною (тому що я зіткнувся з цією проблемою під час серіалізації JSON) ... але якщо ви використовуєте щось подібне до списку <Tuple <string, string >> data; ви почнете мати помилку "без параметричного кондуктора". Тому що .Net не може / не створює Tuples (у мене немає жодної відмітки, але Tuple <string, string> data = new Tuple <string, string> (); не збирається ... поки Tuple <string, string> data = new Tuple <string, string> ("", ""); це нормально
H_He

3
Так, але як ви додаєте конструктор без параметрів до класу, який має залежності, і ви хочете вставити їх у конструктор? Це частина проблеми, яку я не розумію ...
EluciusFTW

2
@ToaoG ваша бібліотека ін'єкційних залежностей повинна запропонувати вам спосіб вибору "конструктора ін'єкцій". Btw, що має ін'єкцію залежності у моделях перегляду, виглядає дивним.
SandRock

89

Це також може бути спричинено, якщо ваша модель використовує 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; }
    }

1
Я витратив стільки часу на це ... і мені довелося перетворити свою помічну функцію, яка повертає SelectList, в той, який поверне список <SelectListItem> .... blarg
Марк

Ви можете використовувати IEnumerable <SelectListItem> та інстанціювати їх у своєму конструкторі як новий Список <SelectListItem> ()
krilovich

Дякую через 3,5 роки!
tonyapolis

Дякую, це було надзвичайно корисно!
Кевін Кулсон

Досі діє 5 років потому. Дякую!
Ніл

23

Вам не потрібно мати дії, що відповідає контролеру.

Схоже на комбінацію контролер / дія:

public ActionResult Action(int parameter)
{

}

але вам потрібно

public ActionResult Action()
{

}

Також перевірте налагоджувач маршруту Філа Хаака, щоб усунути неполадки.


6
Виняток стосується Конструктора, а не методу дії.
Джейсон Вікер

4
@Logrythmik. Повідомлений виняток призначений для конструктора, але проблема полягає в методі дії. У мене був метод класу та дії, який працював, потім додав параметр до методу дії, і я отримав цю помилку. Альтернативним рішенням є надання значення параметру. Або зробіть параметр необов’язковим - це повинно працювати, коли контролер знаходиться в C #, але це не було для мене з F #
Стівен Хоскінг

Крім того, якщо ви робите щось на кшталт @ Html.Action ("SomeAction", новий {myParameter = "42"}), переконайтесь, що ім'я параметра у вашому виклику Html.Action відповідає імені параметра, визначеного в ваш спосіб дії!
JT Taylor

20

За замовчуванням для контролерів MVC потрібен конструктор за замовчуванням без параметрів. Найпростішим було б зробити конструктор за замовчуванням, який викликає той з параметрами:

public MyController() : this(new Helper()) {
}

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

Однак ви можете змінити цю функцію, прокрутивши свій власний ControllerFactory. Таким чином ви можете сказати MVC, що при створенні MyControllerнадайте йому екземпляр Helper.

Це дозволяє використовувати фреймворки Dependency Injection з MVC і реально роз'єднувати все. Хороший приклад цього закінчено на веб-сайті StructureMap . Весь швидкий старт хороший, і він стає специфічним для MVC у напрямку до низу на "Авто-проводці".


6
Я не думаю, що це правильна відповідь, @swilliams. Ключовою тут є частина: визначена для цього об’єкта . Це повідомлення про помилку лайно, яке насправді натякає на передану МОДЕЛЮ ВХОДУ, створити неможливо. Отже, якщо у вас є вхідна модель, яка не має конструктора без параметрів, ви отримуєте цю помилку. Дуже легко подумати, що це стосувалося конструктора CONTROLLER. Але це не так.
Pure.Krome

1
Це дерькове повідомлення, яке буде мати вас на погоні за дикими гусками, якщо не було таких відповідей. Завдяки цій відповіді та відповіді, поданій вище, мені вдалося розібрати речі. Я здогадуюсь, це питання не в повній мірі зрозуміти, що в'яжуче робиться за лаштунками. Я подумав, що він буде просто встановлювати кожну властивість, але чомусь він називає get перед налаштуванням і при публікації. Отже, оскільки я перевантажив конструктор і повинен був компенсувати менший параметр конструктора, я повинен був враховувати нулі, які отримує частина мого майна, що також було несподівано.
eaglei22

18

Ця помилка також виникає при використанні IDependencyResolver , наприклад, при використанні контейнера IoC, і вирішувач залежності повертає нуль. У цьому випадку ASP.NET MVC 3 за замовчуванням використовує DefaultControllerActivator для створення об'єкта. Якщо об’єкт, що створюється, не має загальнодоступного конструктора no-args, виняток буде викинуто будь-коли, коли наданий вирішувач залежності повернеться в нуль.

Ось один такий слід стека:

[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

2
Це спричинило мою проблему: мій вирішувач залежності не зміг сконструювати мій контролер через виняток. Він проковтнув роздільну здатність, повернув нуль і рамка MVC переключилася на активатор контролера за замовчуванням, в результаті чого описується помилка.
Беріз

@ jmona789 Перевірте, чи встановлено всі введені вами залежності у вашому Global.asax.
aloisdg переходить на codidact.com

13

Цей виняток можна отримати у багатьох місцях у рамках MVC (наприклад, він не може створити контролер або не може створити модель для надання цього контролера).

Єдиний найпростіший спосіб діагностувати цю проблему - це перекрити 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 (наприклад, конструкція контролера).


Ось що я думав зробити для своєї проблеми.
Дуг Чемберлен

Бажаю, щоб я міг більше підтримати це. Врятувало мене більше ніж кілька хвилин мого часу.
Кіт

8

У мене така ж помилка, винуватець у моєму випадку - конструктор, який не був ні державним, ні приватним .

Для цього об'єкта не визначений конструктор без параметрів.

Деталі винятку: System.MissingMethodException: для цього об'єкта не визначено конструктор без параметрів.

Код Repro: Переконайтеся, що перед цим конструктор відкрито.

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

    public string name
    {
        get;
        set;
    }
}

4
Так само, як примітка, не вистачає модифікаторів доступу на конструкторі за замовчуванням до "внутрішнього" у компіляторі.
lsuarez

1
розміщення там "приватного" модифікатора не вирішить проблему.
krzyski

7

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

47:10 хвилин показує помилку та показує, як змінити типовий ControllerFactory. Тобто для створення заводу контролерів структури структури.

В основному, ви, ймовірно, намагаєтесь реалізувати ін'єкцію залежності ??

Проблема полягає в тому, що це залежність від інтерфейсу.


І ви можете отримати клас StructureMapControllerFactory від проекту MVC Storefront
Gautam Jain

6

Я отримав таку ж помилку, коли:

Використовуючи власний 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)
{...}

Проблема полягала в тому, що Перегляд отримав ModelView (потрібна інформація про продукт і список категорій), але після подання повертався лише об’єкт Продукту, але оскільки очікується, що POST Add очікує ProductModelView, він пройшов NULL, але тоді конструктору ProductModelView потрібні два параметри ( Product, RootCategories), тоді він намагався знайти інший конструктор без параметрів для цього випадку NULL, тоді не вдається з "no parametles ..."

Отже, виправляючи POST Додати, виправте проблему:

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

Сподіваюся, це може комусь допомогти (я витратив майже пів дня, щоб дізнатися це!).


Несторе, це освічує і здається правильним. Але чому View повертає інший об'єкт, який він отримує, тобто об'єкт Product, а не ProductViewModel?
GilShalit

О, це було специфічно для мого випадку, оскільки мені потрібно зберігати дані лише для Продуктів, RootCa категории передавались у вигляд лише для друку, на ньому не було зроблено жодних введень, тому їх значення (RootCategories) не зберігалися у <вході > або деінде. Чи потрібно мені зберігати той самий ViewModel, я б наполегливо використовував форму <input>, дані перегляду чи щось інше.
Нестор

GilShalit, сьогодні я знайшов відповідь (вибачте, я повільний!), Дивлячись на відображений HTML-код, я побачив, що вхід бере назву [ObjectName]. [Властивість], але від оригінального ViewModel немає і сліду, тому ви можете отримати лише кожного об'єкта всередині ViewModel, але не повного ViewModel. Приклад:, якщо ваш ProductViewModel vm має всередині об'єктів Product p і Category c, то ваш GET-контролер надсилає одну модель vm до Перегляду, тоді ви POST-контролер може приймати лише такі параметри, як (Product p, Category c), але не vm. .. якщо я помиляюся, буду вдячний за відгуки.
Нестор

5

Те саме для мене. Моя проблема з'явилася, тому що я забув, що мій базовий клас моделі вже має властивість з назвою, яке було визначено у представленні .

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.

Сподіваюся, що це допомагає.


5

У мене була аналогічна проблема, і в основному справа в тому, що в методі дії є деякі аргументи, які не були надані в процесі прив'язки моделі (інакше кажучи, ці поля не були подані сторінкою, що подає).

Ця проблема виникне, навіть якщо всі аргументи, окрім одного, представлені, і навіть якщо той, що відсутній, є нульовим типом.

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

Рішення полягає в тому, щоб 1) перевірити, чи відповідають імена 2) забезпечити значення за замовчуванням для аргументу 3) або надати інший метод дії без цього аргументу.


Дякую @yo hal, ваша відповідь виявилася такою, яка вирішила мій конкретний екземпляр цієї помилки. Повідомлення про помилку, яке випльовує рамка, виявляється найменш корисним повідомленням про помилку, колись у цьому випадку.
Скотт Лоуренс

4

У мене була і ця проблема, і я думав, що поділюсь, оскільки не можу знайти свою проблему вище.

Це був мій код

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

Виклик цього ActionResult:

public ActionResult Overview(int id)

Я припускав, що це буде досить розумним, щоб зрозуміти, що значення, яке я передаю йому, є параметром id для огляду, але це не так. Це виправлено:

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


4

Я отримав той самий виняток через те, що не було безпараметричного громадського виконавця

Код був таким:

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

змінено на

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

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


У мене виникли ті ж проблеми, коли використовувався захищений конструктор в базовому класі - здається очевидним рішенням зараз!
keithl8041

4

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

Атрибут [Obsolete("For model binding only", true)]над загальнодоступним конструктором видасть помилку компілятора, якщо інший розробник спробує це використати. Мені потрібні віки, щоб знайти це, сподіваюся, що це комусь допоможе.


Ідеально - додавання цього атрибуту дозволило прив'язці моделі MVC працювати під час виконання, а встановлення булевого параметра атрибута до істинного запобігала (під час компіляції) будь-якої спроби інстанціювати конструктор без параметрів. Найкраща відповідь тут.
Грег Тревелік

3

Я отримав цю помилку. Я використовував інтерфейси в своєму конструкторі, і мій вирішальник залежності не зміг вирішити, коли я зареєстрував його, тоді помилка пішла.


Якщо у вас є нове запитання, будь ласка, опублікуйте його як таке. Це повинно бути або коментарем, або новим питанням, оскільки воно не намагається відповісти на проблему.
Nahuel Ianni

2

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

Якщо ви використовуєте інтерфейс для роз'єднання з'єднання з вашим DbContext (як я), ви можете використовувати структураmap.mvc (3 або 4 - пакет нудгетів ), щоб мати можливість використовувати конструкцію у вашому класі контролера. Це дасть вам папку DependencyResolution. Просто змініть коментований рядок за допомогою програми <<InterfaceClass> () та для використання <DbContextClass> ().


2

Хоча це може бути очевидним для деяких, винуватцем цієї помилки для мене був метод MVC, який прив'язувався до моделі, яка містила властивість типу Tuple<>. Tuple<>не має конструктора без параметрів.


1

У мене була така ж проблема, але пізніше було виявлено, що додавання будь-якого нового інтерфейсу та відповідного класу вимагає, щоб він був зареєстрований в ініціалізаційному модулі для введення залежності. У моєму випадку це був внутрішній код наступним чином:

[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)
    {
    }
}

}


1

У моєму випадку [Serializable]атрибут мав мій клас .

Вам потрібен конструктор, який не приймає жодних параметрів, якщо це ваш клас [Serializable]


0

Ця помилка почалася для мене, коли я додав новий спосіб інстанціювати клас.

Приклад:

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

0

Я додав форму DropDownListдо своєї форми, однак у моєму випадку вона не була (і не передбачалася) надсилатись із формою, оскільки вона була поза <form></form>тегами:

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

Оскільки Модель містила поле лише для відображення, це також спричинило No parameterless constructor defined for this objectпомилку, оскільки поле взагалі не було подано.

У цьому випадку я виправив це, додавши прив'язку виключення:

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

0

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

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

Моєю проблемою було те, що конструктор із типовими параметрами також запустив цей виняток.

Помилка:

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

Працює:

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

0

Найімовірніше, у вашому контролері може бути параметризований конструктор, і який би ви не використовували вирішувач залежності, він не в змозі правильно вирішити залежність. Вам потрібно поставити точку розриву, де записаний метод вирішувача залежності, і ви отримаєте точну помилку у внутрішньому виключенні.


0

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

Щойно видалено HttpFileCollectionBase filesз аргументу методу Post Action та додано як HttpFileCollectionBase files = Request.Files;у тіло методу.


0

Я додав конструктор без параметрів до моделі всередині папки DOMAIN, і проблема вирішена.

введіть тут опис зображення

 public User()
        {

        }

-3

Тому я вже отримав це повідомлення і під час дзвінка в Аякс. Отже, що в основному вимагає, це конструктор у тому типовому класі моделі, який викликається контролером, не має жодного параметра.

Ось приклад

public class MyClass{

     public MyClass(){} // so here would be your parameterless constructor

 }

Я видалив конструктор за замовчуванням з моделі, це працює для мене.
Мусакхір сказав
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.