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

У меня просто была похожая проблема. Такое же исключение возникает, когда 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
    {
    }
}
песчаник
источник
16
При размещении данных JSON в моем действии я получал похожую ошибку. Оказывается, моя модель, к которой она пытается привязаться, не имеет конструктора без параметров!
Тим
1
NB: У меня есть эта проблема (без бла бла без параметров) во время сериализации, если я определяю конструктор, а не конструктор без параметров. Я имею в виду, что в этом примере, если вы удалите определенный вами конструктор (public MyModel (IHelper helper) {}), проблема исчезнет ... поэтому каждый раз, когда вы создаете конструктор, вы должны создавать конструктор без параметров ... Я могу понять, это как: когда вы начинаете определять конструктор, система не рискует создавать «объекты по умолчанию», потому что не знает, имеет ли это смысл ... что-то в этом роде.
H_He
1
Кортежи ... может быть, для некоторых других людей, которые приходят сюда: если у вас есть только кортежи (например, Tuple <string, string> data) в вашем классе, сериализация будет в порядке (потому что я столкнулся с этой пробой во время сериализации JSON) ... но если вы используете что-то вроде List <Tuple <string, string >> data; вы начнете иметь ошибку «без параметров без контура». Потому что .Net не может / не может создавать кортежи (у меня нет ссылки на это, но Tuple <string, string> data = new Tuple <string, string> (); не компилируется ... в то время как Tuple <string, string> data = new Tuple <string, string> ("", ""); все в порядке.
H_He
3
Да, но как вы добавляете конструктор без параметров в класс, который имеет зависимости, и вы хотите внедрить их в конструктор? Это часть проблемы, которую я не понимаю ...
EluciusFTW
2
@ToaoG ваша библиотека внедрения зависимостей должна предоставить вам возможность выбрать «конструктор внедрения». Кстати, наличие внедрения зависимости в viewmodels выглядит странно.
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, в функцию, которая возвращала бы List <SelectListItem> .... blarg
Mark
Вы можете использовать IEnumerable <SelectListItem> и создавать их экземпляры в своем конструкторе как новый List <SelectListItem> ()
krilovich
Спасибо, 3,5 года спустя!
Тоняполис
Спасибо, это было очень полезно!
Кевин Колсон
Все еще действует 5 лет спустя. Спасибо!
Нил
23

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

Похоже на комбинацию контроллер / действие у вас есть:

public ActionResult Action(int parameter)
{

}

но тебе нужно

public ActionResult Action()
{

}

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

Мартин
источник
6
Исключение относится к конструктору, а не к методу действия.
Джейсон Уикер
4
@Logrythmik. Сообщаемое исключение относится к конструктору, но проблема заключается в методе действия. У меня был класс и метод действия, который работал, затем добавил параметр в метод действия и получил эту ошибку. Альтернативное решение заключается в предоставлении значения для параметра. Или сделайте параметр необязательным - это должно работать, когда контроллер находится в C #, но это не для меня с F #
Стивен Хоскинг
Кроме того, если вы делаете что-то вроде @ Html.Action ("SomeAction", new {myParameter = "42"}), убедитесь, что имя параметра в вашем вызове Html.Action соответствует имени параметра, определенного в Ваш метод действия!
JT Тейлор
20

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

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

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

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

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

swilliams
источник
6
Я не думаю, что это правильный ответ, @swilliams. Ключ здесь - это часть: определенная для этого объекта . Это сообщение об ошибке дерьмо, которое на самом деле намекает на входную модель (ы) не может быть создан. Поэтому, если у вас есть входная модель, у которой нет конструктора без параметров, вы получите эту ошибку. Очень легко подумать, что это связано с конструктором CONTROLLER. Но это не так.
Pure.Krome
1
Это дерьмовое сообщение, которое заставит вас идти в погоню, если бы не такие ответы. Благодаря этому ответу и ответу, приведенному выше, я смог все расставить по местам. Я предполагаю, что это не полное понимание того, что переплет делает за кулисами. Я полагал, что он просто устанавливает каждое свойство, но по какой-то причине он вызывает функцию get перед настройкой при публикации. Поэтому, поскольку я перегружал свой конструктор и должен был компенсировать конструктор без параметров, мне пришлось учитывать пустые значения, которые получает часть моего свойства, что также было неожиданным.
eaglei22
18

Эта ошибка также возникает при использовании IDependencyResolver , например, при использовании контейнера IoC, и преобразователь зависимостей возвращает значение NULL. В этом случае ASP.NET MVC 3 по умолчанию использует DefaultControllerActivator для создания объекта. Если создаваемый объект не имеет общедоступного конструктора без аргументов, то исключение будет выдаваться каждый раз, когда предоставленный преобразователь зависимостей вернул значение 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
Калеб Педерсон
источник
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: для этого объекта не определен конструктор без параметров.

Код репро: убедитесь, что перед конструктором есть public.

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

    public string name
    {
        get;
        set;
    }
}
Хаммад хан
источник
4
Как примечание, отсутствие модификаторов доступа в конструкторе по умолчанию равно «внутреннему» в компиляторе.
Исуарес
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 (требуется информация о продукте и списке категорий), но после отправки возвращал только объект Product, но поскольку POST Add ожидал ProductModelView, он передал NULL, но тогда конструктору ProductModelView потребовалось два параметра ( Product, RootCategories), затем он попытался найти другой конструктор без параметров для этого пустого случая, а затем потерпел неудачу с "без параметров ..."

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

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

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

Нестор
источник
Нестор, это поучительно и кажется правильным. Но почему View возвращает другой объект, который он получает, т.е. объект Product, а не ProductViewModel?
ГилШалит
О, это было специфично для моего случая, так как мне нужно хранить данные только для Продуктов, RootCategories был передан в представление только для распечатки, входные данные для него не были сделаны, поэтому их значения (RootCategories) не были сохранены в <input > или где-нибудь еще. Если мне нужно сохранить ту же ViewModel, я бы сохранил ее, используя форму <input>, представление данных или что-то еще.
Нестор
GilShalit, сегодня я нашел ответ (извините, я медленный!), Глядя на отрисованный HTML, я увидел, что вход принимает имя [ObjectName]. [Property], но нет оригинальной ViewModel, поэтому вы можете получить только каждый отдельный объект внутри ViewModel, но не сам ViewModel. Пример: если ваш ProductViewModel vm имеет внутренние объекты Product p и Category c, то ваш GET-контроллер отправляет одну модель vm в View, тогда ваш 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

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

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

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

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

Йоэль Хэлб
источник
Спасибо @yo hal, ваш ответ оказался тем, что решил мой конкретный случай этой ошибки. Сообщение об ошибке, которое выдает инфраструктура, оказывается наименее полезным сообщением об ошибке в этом случае.
Скотт Лоуренс
4

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

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

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

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

public ActionResult Overview(int id)

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

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 работать во время выполнения, а установка для логического параметра атрибута значения true предотвратила (во время компиляции) любые попытки создания конструктора без параметров. Лучший ответ здесь.
Грег
3

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

Ahmed
источник
Если у вас есть новый вопрос, пожалуйста, опубликуйте его как таковой. Это должен был быть либо комментарий, либо новый вопрос, поскольку он не пытается ответить на проблему.
Науэль Янни
2

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

Если вы используете интерфейс , чтобы разъединить соединение против вашего DbContext (как я) , вы можете использовать structuremap.mvc (3 или 4 - nudget пакет ) , чтобы иметь возможность использовать Constructure в классе контроллера. Это даст вам папку DependencyResolution. Просто измените закомментированную строку с помощью For <InterfaceClass> () и используйте <DbContextClass> ().

JeppePepp
источник
2

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

Тайлер Форсайт
источник
1

У меня была та же проблема, но позже я обнаружил, что добавление любого нового интерфейса и соответствующего класса требует его регистрации в 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<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)
    {
    }
}

}

arokanika
источник
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в свою форму a , однако в моем случае он не был (и не должен был быть) отправлен с формой, как это было за пределами <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)
SilverlightFox
источник
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

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

Вот пример

public class MyClass{

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

 }
Carla
источник
Я удалил конструктор по умолчанию из модели, это работает для меня.
Мусакхир Сайед