ASP.NET MVC: Pas de constructeur sans paramètre défini pour cet objet
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 Steven Sanderson s ' Pro ASP.NET Framework MVC " livre. Sur la page 132, conformément à l'auteur de la recommandation, j'ai téléchargé le ASP.NET MVC Terme de l'assemblée, et de l'ajouter à mon projet MVC. [Note: Ce pourrait être un leurre.]
Après cela, je ne peux plus charger mon projet. L'erreur ci-dessus m'a arrêté froid.
Ma question est pas, "Pourriez-vous m'aider à corriger mon code?"
Au lieu de cela, je voudrais savoir de manière plus générale:
- Comment dois-je résoudre ce problème?
- Que dois-je chercher?
- Ce qui pourrait la cause racine être?
Il me semble que je doit comprendre le routage et les contrôleurs à un niveau plus profond que ce que je fais maintenant.
Vous devez vous connecter pour publier un commentaire.
J'ai juste eu un problème similaire. La même exception se produit lorsqu'un
Model
n'a pas de constructeur sans paramètre.La pile d'appels a été de trouver une méthode responsable de la création d'une nouvelle instance d'un modèle.
Voici un exemple:
Cela peut aussi être causé si votre Modèle à l'aide d'un SelectList, que cela n'a pas de constructeur sans paramètre:
Vous aurez besoin de restructurer le modèle de le faire d'une autre façon, si c'est la cause. Donc, à l'aide d'un
IEnumerable<Contact>
et de l'écriture d'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 le @Mark et @krilovich approche, il faut juste remplacer SelectList à IEnumerable, il travaille avec MultiSelectList trop.
ReadOnlyCollection
SelectList Contacts
propriété ne sera pas initialisé, par conséquent, un constructeur n'est jamais appelé (à moins bien sûr que vous avez fait quelque chose de fou comme essayer de passer en arrière de paires nom/valeur pour chaqueSelectListItem
dans la collection en générant des entrées pour eux.Vous avez besoin de l'action qui correspond au contrôleur n'ont pas de paramètre.
Ressemble pour l'action de contrôleur de combinaison que vous avez:
mais vous avez besoin
Aussi, découvrez Phil Haack est Itinéraire Débogueur pour résoudre les routes.
Par défaut, les Contrôleurs MVC besoin d'un constructeur par défaut sans paramètre. Le plus simple serait de faire un constructeur par défaut qui appelle celui avec les paramètres:
Toutefois, vous pouvez remplacer cette fonctionnalité par roulement de votre propre
ControllerFactory
. De cette façon, vous pouvez dire MVC que lorsque vous créez unMyController
donner un exemple deHelper
.Cela vous permet d'utiliser l'Injection de Dépendance cadres avec MVC, et vraiment dissocier de tout. Un bon exemple de ce est au cours du StructureMap site web. L'ensemble de démarrage rapide est bonne, et il obtient spécifiques à MVC vers le bas "Auto Câblage".
Cette erreur se produit également lorsque vous utilisez un IDependencyResolver, comme lors de l'utilisation d'un conteneur IoC, et la résolution de dépendances renvoie la valeur null. Dans ce cas ASP.NET MVC 3 valeurs par défaut à l'aide de la DefaultControllerActivator pour créer l'objet. Si l'objet créé ne pas avoir un public de non-args constructeur une exception sera ensuite jeté tout temps à la condition d'solveur de dépendances retourné null.
Voici un exemple de trace de pile:
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 le contrôleur).
Le moyen le plus facile que j'ai trouvé pour diagnostiquer ce problème est de remplacer MVC comme proche de l'exception que possible avec votre propre code. Puis votre code de saut de ligne dans Visual Studio lorsque cette exception se produit, et vous pouvez lire le Type à l'origine du problème de la trace de la pile.
Cela semble être une horrible manière d'aborder ce problème, mais il est très rapide, et très cohérent.
Par exemple, si cette erreur se produit à l'intérieur de la MVC DefaultModelBinder (qui vous permettra de savoir en cochant la trace de la pile), puis remplacer le DefaultModelBinder avec ce code:
Et mise à jour de votre Global.asax.cs:
Maintenant, la prochaine fois que vous obtenez cette exception, Visual Studio va s'arrêter à l'intérieur de votre MyDefaultModelBinder classe, et vous pouvez cocher la case "modelType" bien de voir ce type ont causé le problème.
L'exemple ci-dessus fonctionne pour quand vous obtenez l' "Pas de constructeur sans paramètre défini pour cet objet" exception lors de la liaison de modèle, seulement. Mais le même code peut être écrit pour d'autres points d'extension MVC (par exemple, le contrôleur de la construction).
J'ai eu la même erreur, le coupable dans mon cas, c'était le constructeur qui était ni public ni privé.
Repro code: assurez-vous que le constructeur a public avant elle.
Première vidéo sur http://tekpub.com/conferences/mvcconf
47:10 minutes en montrer l'erreur et montre comment remplacer la valeur par défaut ControllerFactory.
I. e. pour créer la structure de la carte contrôleur de l'usine.
Fondamentalement, vous êtes probablement en train de mettre en œuvre l'injection de dépendance??
Le problème est que l'interface est la dépendance.
J'ai eu le même message d'erreur lors de l':
À l'aide d'un custom ModelView, les deux Actions (GET et POST) étaient de passage à la ModelView qui contient deux objets:
Et la POSTE a également accepté la même vue du modèle:
Problème a été le point de Vue a reçu le ModelView (ce qui est nécessaire à la fois le produit et la liste des catégories d'informations), mais après l'envoi de retourner le Produit à l'objet, mais que le POSTE devrait Ajouter un ProductModelView il a passé un NUL mais alors la ProductModelView seul constructeur besoin de deux paramètres(Produit, RootCategories), puis il a essayé de trouver un autre constructeur sans paramètres pour cette NULL en cas d'échec avec "pas de parameterles..."
Ainsi, la fixation de la POSTE Ajouter comme suit corriger le problème:
J'espère que cela peut aider quelqu'un (j'ai passé presque la moitié de la journée de la trouver!).
De même pour moi.
Mon problème est apparu, j'ai oublié que mon modèle de base de la classe a déjà bien avec le nom de qui a été défini dans la vue.
... le contrôleur et le modèle de traitement :
Rien de spécial, non? Mais puis-je définir la vue ...
... ce qui provoque le "constructeur sans paramètre" erreur sur la requête POST.
Espère que ça aide.
J'ai eu un problème similaire, et, essentiellement, le point est qu'il y a quelques arguments à la méthode d'action qui n'ont pas été fournis par le Modèle de processus de Liaison, (et en d'autres termes, ces champs n'ont pas été soumis par la soumission de la page).
Ce problème va venir, même si tous les arguments, mais sont fournis, et même si l'un manque, c'est un type nullable.
Le problème pourrait également être le résultat d'une faute de frappe, dans lequel le nom de l'argument et le nom du champ de formulaire ne seront pas identiques.
La solution: 1) de vérifier que les noms correspondent 2) fournir une valeur par défaut de l'argument 3) ou de fournir une autre méthode d'action sans cet argument.
J'ai eu ce problème et j'ai pensé partager car je ne peux pas trouver mon problème ci-dessus.
C'était mon code
return RedirectToAction("Overview", model.Id);
L'appel de cette ActionResult:
public ActionResult Overview(int id)
J'ai supposé qu'il serait assez intelligent pour comprendre que la valeur que je passe c'est l'id de paramètre pour une vue d'ensemble, mais il n'est pas. Ce corrigé:
return RedirectToAction("Overview", new {id = model.Id});
Je me suis même exception en raison il n'était pas sans paramètre public constructeur
Code était comme ça:
changé à
problème résolu pour moi.
J'ai eu le même problème...
Si vous utilisez une interface de dissocier votre connexion à l'encontre de votre DbContext (comme moi), vous pouvez utiliser structuremap.mvc (3 ou 4 nudget paquet) pour être en mesure d'utiliser un constructure dans votre contrôleur de classe. Cela vous donnera une DependencyResolution dossier. Il suffit de changer la ligne de commentaire avec votre Pour< InterfaceClass >() et d'Utiliser< DbContextClass >().
C'est peut-être évident pour certains, le coupable de cette erreur pour moi, c'était mon modèle MVC était contraignant pour un modèle qui contenait une propriété de type
Tuple<>
.Tuple<>
n'a pas de constructeur sans paramètre.Toutes les réponses que dire de créer un des paramètres de moins de constructeur qui n'est pas idéal si vous ne voulez pas les autres développeurs de l'utiliser et que le modèle de classeur.
L'attribut
[Obsolete("For model binding only", true)]
au-dessus d'un constructeur public lèvera une erreur de compilation si un autre dev tente d'utiliser ce. M'a pris âges à trouver cet, espérons que cela aide quelqu'un.J'ai eu cette erreur. J'ai été en utilisant des interfaces dans mon constructeur et mon solveur de dépendances n'était pas en mesure de résoudre, quand je me suis inscrit alors l'erreur de s'en alla.
Cette erreur a commencé pour moi quand j'ai ajouté une nouvelle façon d'instancier une classe.
Exemple:
L'erreur a été résolu lorsque j'ai ajouté quand j'ai fait cette modification, l'ajout d'un constructeur sans paramètre. Je crois que le compilateur crée un sans paramètre constuctor par défaut, mais si vous ajoutez votre propre alors vous devez explicitement le créer.
J'avais ajouté un
DropDownList
de ma forme, mais dans mon cas ce n'était pas (et n'était pas destiné à être) soumis avec le formulaire tel qu'il était à l'extérieur de la<form></form>
tags:Comme le Modèle de contenu du champ uniquement pour l'affichage, cela a également causé la
No parameterless constructor defined for this object
erreur, parce que le champ n'a pas été soumis à tous.Dans ce cas, j'ai corrigé par l'ajout d'une exclure de liaison:
Ce qui m'est arrivé, et les résultats sur cette page ont été une bonne ressource qui m'a conduit dans de nombreuses directions, mais je voudrais ajouter une autre possibilité:
Comme indiqué dans d'autres réponses, la création d'un constructeur avec paramètres supprime l'implicite constructeur sans paramètre, vous devez explicitement le type de l'.
Quel était mon problème était qu'un constructeur avec paramètres par défaut a également déclenché cette exception.
Donne des erreurs:
Travaux:
Plus probablement que vous pourriez avoir paramétré un constructeur dans votre contrôleur et quelle que soit la résolution de dépendances vous utilisez n'est pas en mesure de résoudre la dépendance correctement. Vous avez besoin de mettre de point de rupture où la résolution de dépendances méthode qui est écrit et vous obtiendrez l'erreur exacte dans le centre d'exception.
J'ai eu le même problème mais trouvé plus tard que l'ajout de toute nouvelle interface et correspondant de la classe nécessite d'être enregistré en vertu de Initializable Module pour l'injection de dépendances. Dans mon cas, c'était dans le code comme suit:
}
J'ai eu le même problème.
Juste Enlevé
HttpFileCollectionBase files
d'Action Post argument de méthodeet ajouté comme
HttpFileCollectionBase files = Request.Files;
dans le corps de la méthode.Dans mon cas, ma classe a eu la
[Serializable]
attribut.Vous êtes tenus d'avoir un constructeur qui ne prend aucun paramètre si votre classe est
[Serializable]
Donc, j'ai eu ce message avant ainsi, lorsque vous faites un appel ajax. Donc, ce qu'il est fondamentalement demande, c'est un constructeur dans la classe du modèle qui est appelé par la contolleur, n'ont aucun paramètre.
Voici un exemple