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.
Cela peut également se produire si votre modèle utilise une SelectList, car il n'a pas de constructeur sans paramètre :
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é:Ou vous pouvez utiliser l'approche @Mark et @krilovich, il suffit de remplacer SelectList par IEnumerable, cela fonctionne aussi avec MultiSelectList.
la source
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:
mais tu as besoin
Consultez également le débogueur de route de Phil Haack pour dépanner les routes.
la source
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:
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,MyController
donnez-lui une instance deHelper
.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".
la source
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:
la source
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:
Et mettez à jour votre Global.asax.cs:
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).
la source
J'ai eu la même erreur, le coupable dans mon cas était le constructeur qui n'était ni public ni privé .
Repro code: assurez-vous que le constructeur a public avant lui.
la source
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.
la source
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:
Et le POST acceptant également la même vue du modèle:
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:
J'espère que cela peut aider quelqu'un (j'ai passé presque une demi-journée à le découvrir!).
la source
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 .
... et modèle de traitement du contrôleur:
Rien de spécial, non? Mais alors je définis la vue ...
... ce qui provoque une erreur "Constructeur sans paramètre" sur la requête POST.
J'espère que cela pourra aider.
la source
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.
la source
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});
la source
J'ai eu la même exception car il n'y avait pas de constructeur public sans paramètre
Le code était comme ceci:
changé en
problème résolu pour moi.
la source
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.la source
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.
la source
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> ().
la source
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.la source
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:
}
la source
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]
la source
Cette erreur a commencé pour moi lorsque j'ai ajouté une nouvelle façon d'instancier une classe.
Exemple:
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.
la source
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:Comme le modèle contenait le champ à afficher uniquement, cela a également provoqué l'
No parameterless constructor defined for this object
erreur car le champ n'a pas été soumis du tout.Dans ce cas, je l'ai corrigé en ajoutant une liaison d'exclusion:
la source
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:
Travaux:
la source
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.
la source
J'ai eu le même problème.
Juste retiré
HttpFileCollectionBase files
de l'argument de méthode Post-Action et ajouté commeHttpFileCollectionBase files = Request.Files;
dans le corps de la méthode.la source
J'ai ajouté un constructeur sans paramètre au modèle à l'intérieur du dossier DOMAIN, et le problème est résolu.
la source
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
la source