ASP.NET MVC: aucun constructeur sans paramètre défini pour cet objet

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

Je suivais le livre « Pro ASP.NET MVC Framework » de Steven Sanderson . À la page 132, conformément à la recommandation de l'auteur, j'ai téléchargé l'assembly ASP.NET MVC Futures et l'ai ajouté à mon projet MVC. [Remarque: cela pourrait être un hareng rouge.]

Après cela, je ne pouvais plus charger mon projet. L'erreur ci-dessus m'a arrêté de froid.

Ma question n'est pas : "Pouvez-vous m'aider à corriger mon code?"

Au lieu de cela, j'aimerais savoir plus généralement:

  • Comment dois-je résoudre ce problème?
  • Que dois-je rechercher?
  • Quelle pourrait en être la cause principale?

Il semble que je devrais comprendre le routage et les contrôleurs à un niveau plus profond que je ne le fais maintenant.

Jim G.
la source

Réponses:

226

J'ai juste eu un problème similaire. La même exception se produit lorsqu'unModel n'a pas de constructeur sans paramètre.

La pile d'appels figurait une méthode responsable de la création d'une nouvelle instance d'un modèle.

System.Web.Mvc.DefaultModelBinder. CreateModel (ControllerContext controllerContext, ModelBindingContext bindingContext, Type modelType)


Voici un exemple:

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
    {
    }
}
SandRock
la source
16
Lors du POST de données JSON dans mon action, j'obtenais une erreur similaire. Il s'avère que mon modèle auquel il tente de se lier n'a pas de constructeur sans paramètre!
Tim
1
NB: je n'ai ce problème (pas de bla bla sans paramètre ...) lors de la sérialisation si je définis un constructeur, et non un constructeur sans paramètre. Je veux dire, dans cet exemple, si vous supprimez le constructeur que vous avez défini (public MyModel (IHelper helper) {}) le problème disparaît ... donc chaque fois que vous créez un constructeur, vous devez en créer un sans paramètre ... je peux comprendre comme: une fois que vous commencez à définir un constructeur, le système ne prend pas le risque de créer des «objets par défaut» car il ne sait pas si cela a du sens ... quelque chose comme ça.
H_He
1
Tuples ... peut-être pour d'autres personnes qui viennent ici: si vous n'avez que des tuples (comme Tuple <string, string> data;) dans votre classe, la sérialisation sera ok (car j'ai rencontré ce problème lors de la sérialisation JSON) ... mais si vous utilisez quelque chose comme List <Tuple <string, string >> data; vous commencerez à avoir l'erreur «aucun constructeur sans paramètre». Parce que .Net ne peut pas / ne crée pas de tuples (je n'ai pas de référence pour cela mais Tuple <string, string> data = new Tuple <string, string> (); ne compilera pas ... tandis que Tuple <string, string> data = new Tuple <string, string> ("", ""); est ok.
H_He
3
Ouais, mais comment ajouter un constructeur sans paramètre à une classe qui a des dépendances et que vous souhaitez les injecter dans le constructeur? C'est la partie du problème que je n'obtiens pas ...
EluciusFTW
2
@ToaoG votre bibliothèque d'injection de dépendances devrait vous fournir un moyen de sélectionner le "constructeur d'injection". Btw, avoir une injection de dépendance dans viewmodels semble étrange.
SandRock
89

Cela peut également se produire si votre modèle utilise une SelectList, car il n'a pas de constructeur sans paramètre :

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

Vous devrez refactoriser votre modèle pour le faire d'une manière différente si c'est la cause. Donc, en utilisant IEnumerable<Contact>et en écrivant une méthode d'extension qui crée la liste déroulante avec les différentes définitions de propriété:

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(..)
}

Ou vous pouvez utiliser l'approche @Mark et @krilovich, il suffit de remplacer SelectList par IEnumerable, cela fonctionne aussi avec MultiSelectList.

 public class MyViewModel
    {
        public Contact SelectedContact { get;set; }
        public IEnumerable<SelectListItem> Contacts { get;set; }
    }
Chris S
la source
1
J'ai perdu tellement de temps là-dessus ... et j'ai dû transformer ma fonction d'aide qui renvoyait une SelectList en une qui renverrait une liste <SelectListItem> .... blarg
Mark
Vous pouvez utiliser IEnumerable <SelectListItem> et les instancier dans votre constructeur en tant que nouveau List <SelectListItem> ()
krilovich
Merci 3,5 ans plus tard!
tonyapolis
Merci, cela a été extrêmement utile!
Kevin Coulson
Toujours valable 5 ans plus tard. Merci!
Neill
23

Vous avez besoin de l'action qui correspond au contrôleur pour ne pas avoir de paramètre.

Ressemble à la combinaison contrôleur / action que vous avez:

public ActionResult Action(int parameter)
{

}

mais tu as besoin

public ActionResult Action()
{

}

Consultez également le débogueur de route de Phil Haack pour dépanner les routes.

Martin
la source
6
L'exception est liée au constructeur, pas à la méthode d'action.
Jason Wicker
4
@Logrythmik. L'exception signalée concerne le constructeur, mais le problème réside dans la méthode d'action. J'avais une méthode de classe et d'action qui fonctionnait, puis j'ai ajouté un paramètre à la méthode d'action et j'ai obtenu cette erreur. Une autre solution consiste à fournir une valeur pour le paramètre. Ou rendez le paramètre facultatif - cela devrait fonctionner lorsque le contrôleur est en C #, mais ce n'est pas le cas pour moi avec F #
Stephen Hosking
De plus, si vous faites quelque chose comme @ Html.Action ("SomeAction", new {myParameter = "42"}), assurez-vous que le nom du paramètre dans votre appel Html.Action correspond au nom du paramètre défini dans votre méthode d'action!
JT Taylor
20

Par défaut, les contrôleurs MVC nécessitent un constructeur par défaut sans paramètres. Le plus simple serait de créer un constructeur par défaut qui appelle celui avec des paramètres:

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

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

Cependant, vous pouvez remplacer cette fonctionnalité en déployant la vôtre ControllerFactory. De cette façon, vous pouvez dire à MVC que lorsque vous créez un, MyControllerdonnez-lui une instance de Helper.

Cela vous permet d'utiliser des frameworks d'injection de dépendances avec MVC et de vraiment tout découpler. Un bon exemple de ceci est sur le site Web de StructureMap . L'ensemble du démarrage rapide est bon, et il devient spécifique à MVC vers le bas à "Auto Wiring".

swilliams
la source
6
Je ne pense pas que ce soit la bonne réponse, @swilliams. La clé ici est la partie: définie pour cet objet . C'est un message d'erreur de merde qui fait en fait allusion au (x) MODÈLE (s) d'entrée transmis ne peut pas être créé. Donc, si vous avez un modèle d'entrée qui n'a pas de constructeur sans paramètre, vous obtenez cette erreur. Très facile de penser qu'il était lié au constructeur CONTROLLER. Mais ce n'est pas.
Pure.Krome
1
C'est un message de merde, qui vous mènera à la poursuite de l'oie sauvage s'il n'y avait pas de réponses comme celles-ci. Grâce à cette réponse et à la réponse ci-dessus, j'ai pu mettre les choses au clair. Je suppose que c'est une question de ne pas comprendre pleinement ce que fait le classeur dans les coulisses. Je pensais que cela ne ferait que définir chaque propriété, mais pour une raison quelconque, il appelle également le paramètre get avant lors de la publication. Donc, parce que j'ai surchargé mon constructeur et que j'ai dû compenser avec un paramètre moins constructeur, j'ai dû tenir compte des valeurs nulles qu'une partie de ma propriété obtient, ce qui était également inattendu.
eaglei22
18

Cette erreur se produit également lors de l'utilisation d'un IDependencyResolver , par exemple lors de l'utilisation d'un conteneur IoC, et le résolveur de dépendances renvoie null. Dans ce cas, ASP.NET MVC 3 utilise par défaut le DefaultControllerActivator pour créer l'objet. Si l'objet en cours de création n'a pas de constructeur public no-args, une exception sera alors levée chaque fois que le résolveur de dépendances fourni a renvoyé null.

Voici une telle trace de pile:

[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
Kaleb Pederson
la source
2
Cela a causé mon problème: mon résolveur de dépendances n'a pas pu construire mon contrôleur en raison d'une exception. Il a été avalé par le résolveur, a renvoyé null et le framework MVC est passé à l'activateur de contrôleur par défaut, ce qui a entraîné l'erreur décrite.
Beriz
@ jmona789 Vérifiez si vous avez défini toutes vos dépendances injectées dans votre Global.asax.
aloisdg passe à codidact.com
13

Vous pouvez obtenir cette exception à de nombreux endroits différents dans le framework MVC (par exemple, il ne peut pas créer le contrôleur, ou il ne peut pas créer un modèle pour donner ce contrôleur).

Le seul moyen simple que j'ai trouvé pour diagnostiquer ce problème est de remplacer MVC aussi près que possible de l'exception avec votre propre code. Ensuite, votre code sera interrompu dans Visual Studio lorsque cette exception se produit et vous pouvez lire le type à l'origine du problème à partir de la trace de pile.

Cela semble être une manière horrible d'aborder ce problème, mais c'est très rapide et très cohérent.

Par exemple, si cette erreur se produit dans MVC DefaultModelBinder (que vous saurez en vérifiant la trace de la pile), remplacez le DefaultModelBinder par ce code:

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

Et mettez à jour votre Global.asax.cs:

public class MvcApplication : System.Web.HttpApplication
{
...
    protected void Application_Start(object sender, EventArgs e)
    {
        ModelBinders.Binders.DefaultBinder = new MyDefaultModelBinder();
    }
}

Désormais, la prochaine fois que vous obtiendrez cette exception, Visual Studio s'arrêtera dans votre classe MyDefaultModelBinder et vous pourrez vérifier la propriété «modelType» pour voir quel type a causé le problème.

L'exemple ci-dessus fonctionne uniquement lorsque vous obtenez l'exception «Aucun constructeur sans paramètre défini pour cet objet» pendant la liaison de modèle. Mais un code similaire peut être écrit pour d'autres points d'extension dans MVC (par exemple, la construction du contrôleur).

Josh Mouch
la source
C'est ce que je pensais faire pour mon problème.
Doug Chamberlain
J'aimerais pouvoir voter davantage. M'a fait gagner plus de quelques minutes de mon temps.
Keith
8

J'ai eu la même erreur, le coupable dans mon cas était le constructeur qui n'était ni public ni privé .

Aucun constructeur sans paramètre défini pour cet objet.

Détails de l'exception: System.MissingMethodException: aucun constructeur sans paramètre défini pour cet objet.

Repro code: assurez-vous que le constructeur a public avant lui.

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

    public string name
    {
        get;
        set;
    }
}
Hammad Khan
la source
4
Juste une note, manquant de modificateurs d'accès sur un constructeur par défaut à "interne" dans le compilateur.
lsuarez
1
y mettre un modificateur "privé" ne résoudra pas le problème.
krzyski
7

Première vidéo sur http://tekpub.com/conferences/mvcconf

47:10 minutes montrent l'erreur et montre comment remplacer la ControllerFactory par défaut. Ie pour créer une usine de contrôleur de carte de structure.

Fondamentalement, vous essayez probablement d'implémenter l'injection de dépendances ??

Le problème est que c'est la dépendance de l'interface.

Dan B
la source
Et vous pouvez obtenir la classe StructureMapControllerFactory du projet MVC Storefront
Gautam Jain
6

J'ai eu la même erreur quand:

À l'aide d'un ModelView personnalisé, les deux actions (GET et POST) transmettaient le ModelView qui contenait deux objets:

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

Et le POST acceptant également la même vue du modèle:

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

Le problème était que View recevait le ModelView (il fallait à la fois les informations sur le produit et la liste des catégories), mais après avoir soumis, il ne renvoyait que l'objet Product, mais comme l'ajout de POST attendait un ProductModelView, il passait un NULL, mais le constructeur ProductModelView avait besoin de deux paramètres ( Product, RootCategories), puis il a essayé de trouver un autre constructeur sans paramètres pour ce cas NULL puis échoue avec "aucun paramètre ..."

Ainsi, la résolution de l'ajout POST comme suit corrige le problème:

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

J'espère que cela peut aider quelqu'un (j'ai passé presque une demi-journée à le découvrir!).

Nestor
la source
Nestor, c'est éclairant et semble correct. Mais pourquoi la vue renvoie-t-elle un objet différent de ce qu'elle reçoit, c'est-à-dire un objet Product et non ProductViewModel?
GilShalit
Oh, c'était spécifique à mon cas, car je n'ai besoin que de conserver les données pour les produits, les RootCategories ont été passées à la vue uniquement pour être imprimées, aucune entrée n'a été effectuée, donc leurs valeurs (RootCategories) n'ont pas été conservées dans <input > ou ailleurs. Dois-je garder le même ViewModel, je persisterais en utilisant le formulaire <input>, les données de vue ou autre chose.
Nestor
GilShalit, aujourd'hui j'ai trouvé une réponse (désolé je suis lent!), En regardant le rendu HTML, j'ai vu l'entrée prendre le nom de [ObjectName]. [Property], mais il n'y a pas de trace du ViewModel original, donc vous ne pouvez récupérer que chaque individu objet à l'intérieur du ViewModel, mais pas le ViewModel complet lui-même. Exemple:, si votre ProductViewModel vm a des objets internes Product p et Category c, alors votre contrôleur GET envoie un modèle vm à la vue, alors votre contrôleur POST ne peut accepter que des paramètres tels que (Product p, Category c), mais pas le vm. .. si je me trompe j'apprécierais quelques commentaires.
Nestor
5

La même chose pour moi. Mon problème est apparu parce que j'ai oublié que ma classe de modèle de base a déjà une propriété avec le nom qui a été défini dans la vue .

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

... et modèle de traitement du contrôleur:

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

Rien de spécial, non? Mais alors je définis la vue ...

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

... ce qui provoque une erreur "Constructeur sans paramètre" sur la requête POST.

J'espère que cela pourra aider.

Anonyme
la source
5

J'ai eu un problème similaire, et essentiellement le fait est qu'il y a des arguments dans la méthode d'action qui n'ont pas été fournis par le processus de liaison de modèle (et en d'autres termes, ces champs n'ont pas été soumis par la page de soumission).

Ce problème se posera même si tous les arguments sauf un sont fournis, et même si celui qui manque est un type Nullable.

Le problème peut également être le résultat d'une faute de frappe, dans laquelle le nom de l'argument et le nom du champ de formulaire ne seront pas identiques.

La solution consiste à 1) vérifier que les noms correspondent 2) fournir une valeur par défaut pour l'argument 3) ou fournir une autre méthode d'action sans cet argument.

yoel halb
la source
Merci @yo hal, votre réponse s'est avérée être celle qui a résolu mon cas particulier de cette erreur. Le message d'erreur que le framework crache est le message d'erreur le moins utile jamais créé dans ce cas.
Scott Lawrence
4

J'ai eu ce problème aussi et j'ai pensé partager car je ne trouve pas mon problème ci-dessus.

C'était mon code

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

Appel de cette actionResult:

public ActionResult Overview(int id)

J'ai supposé que ce serait assez intelligent pour comprendre que la valeur que je lui transmets est le paramètre id pour Overview, mais ce n'est pas le cas. Cela l'a corrigé:

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

Brik
la source
4

J'ai eu la même exception car il n'y avait pas de constructeur public sans paramètre

Le code était comme ceci:

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

changé en

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

problème résolu pour moi.

Muru Bakthavachalam
la source
J'avais le même problème lors de l'utilisation d'un constructeur protégé dans une classe de base - cela semble une solution évidente maintenant!
keithl8041
4

Toutes les réponses disent de créer un constructeur sans paramètres, ce qui n'est pas idéal si vous ne voulez pas que d'autres développeurs l'utilisent et seulement le classeur de modèles.

L'attribut [Obsolete("For model binding only", true)]au-dessus d'un constructeur public lèvera une erreur de compilateur si un autre développeur essaie de l'utiliser. Il m'a fallu des années pour trouver ça, j'espère que ça aide quelqu'un.

Martin Dawson
la source
Parfait - l'ajout de cet attribut permettait à la liaison de modèle MVC de fonctionner au moment de l'exécution et la définition du paramètre booléen de l'attribut sur true empêchait (au moment de la compilation) toute tentative d'instanciation du constructeur sans paramètre. Meilleure réponse ici.
Greg Trevellick
3

J'ai eu cette erreur. J'utilisais des interfaces dans mon constructeur et mon résolveur de dépendances n'a pas été en mesure de résoudre, lorsque je l'ai enregistré, l'erreur a disparu.

Ahmed
la source
Si vous avez une nouvelle question, postez-la comme telle. Cela aurait dû être un commentaire ou une nouvelle question car il ne tente pas de répondre au problème.
Nahuel Ianni
2

J'ai eu le même problème...

Si vous utilisez une interface pour découpler votre connexion avec votre DbContext (comme moi), vous pouvez utiliser structuremap.mvc (package 3 ou 4 nudget ) pour pouvoir utiliser une construction dans votre classe de contrôleur. Cela vous donnera un dossier DependencyResolution. Changez simplement la ligne commentée avec votre For <InterfaceClass> () et pour Use <DbContextClass> ().

JeppePepp
la source
2

Bien que cela puisse être évident pour certains, le coupable de cette erreur pour moi était que ma méthode MVC se liait à un modèle contenant une propriété de type Tuple<>. Tuple<>n'a pas de constructeur sans paramètre.

Tyler Forsythe
la source
1

J'ai eu le même problème mais j'ai découvert plus tard que l'ajout d'une nouvelle interface et de la classe correspondante nécessite son enregistrement sous Module initialisable pour l'injection de dépendances. Dans mon cas, c'était à l'intérieur du code comme suit:

[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
la source
1

Dans mon cas, ma classe avait le [Serializable] attribut.

Vous devez avoir un constructeur qui ne prend aucun paramètre si votre classe est [Serializable]

Canyon de Kolob
la source
0

Cette erreur a commencé pour moi lorsque j'ai ajouté une nouvelle façon d'instancier une classe.

Exemple:

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

L'erreur a été résolue lorsque j'ai ajouté lorsque j'ai effectué cette modification, en ajoutant un constructeur sans paramètre. Je crois que le compilateur crée un constucteur sans paramètre par défaut, mais si vous ajoutez le vôtre, vous devez le créer explicitement.

    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;
         }
     }
mandrin
la source
0

J'avais ajouté un DropDownListà mon formulaire, mais dans mon cas, il n'était pas (et n'était pas destiné à être) soumis avec le formulaire car il était en dehors des <form></form>balises:

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

Comme le modèle contenait le champ à afficher uniquement, cela a également provoqué l' No parameterless constructor defined for this objecterreur car le champ n'a pas été soumis du tout.

Dans ce cas, je l'ai corrigé en ajoutant une liaison d'exclusion:

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

Cela m'est arrivé, et les résultats sur cette page ont été une bonne ressource qui m'a conduit dans de nombreuses directions, mais j'aimerais ajouter une autre possibilité:

Comme indiqué dans d'autres réponses, la création d'un constructeur avec des paramètres supprime le constructeur implicite sans paramètre, vous devez donc le saisir explicitement.

Mon problème était qu'un constructeur avec des paramètres par défaut a également déclenché cette exception.

Donne des erreurs:

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

Travaux:

public CustomerWrapper(CustomerDto customer){...}
public CustomerWrapper():this(null){}
Bendik August Nesbø
la source
0

Très probablement, vous avez peut-être paramétré le constructeur dans votre contrôleur et le résolveur de dépendances que vous utilisez n'est pas en mesure de résoudre correctement la dépendance. Vous devez mettre un point d'arrêt où la méthode de résolution de dépendances est écrite et vous obtiendrez l'erreur exacte dans l'exception interne.

Mahendra Savale
la source
0

J'ai eu le même problème.

Juste retiré HttpFileCollectionBase filesde l'argument de méthode Post-Action et ajouté comme HttpFileCollectionBase files = Request.Files;dans le corps de la méthode.

Muhammad Yasir
la source
0

J'ai ajouté un constructeur sans paramètre au modèle à l'intérieur du dossier DOMAIN, et le problème est résolu.

entrez la description de l'image ici

 public User()
        {

        }
Mélodie
la source
-3

J'ai donc reçu ce message avant, lors d'un appel ajax. Donc, ce qu'il demande fondamentalement, c'est un constructeur dans cette classe de modèle qui est appelée par le contrôleur, qui n'a aucun paramètre.

Voici un exemple

public class MyClass{

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

 }
Carla
la source
J'ai supprimé le constructeur par défaut du modèle, cela fonctionne pour moi.
Musakkhir Sayyed