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: }
Śledziłem książkę „ Pro ASP.NET MVC Framework ” Stevena Sandersona . Na stronie 132, zgodnie z zaleceniem autora, pobrałem zestaw ASP.NET MVC Futures i dodałem go do swojego projektu MVC. [Uwaga: może to być czerwony śledź].
Po tym nie mogłem już załadować mojego projektu. Powyższy błąd zatrzymał mnie na zimno.
Moje pytanie nie brzmi: „Czy możesz mi pomóc naprawić kod?”
Zamiast tego chciałbym wiedzieć bardziej ogólnie:
- Jak mam rozwiązać ten problem?
- Czego powinienem szukać?
- Jaka może być podstawowa przyczyna?
Wygląda na to, że powinienem zrozumieć routing i kontrolery na głębszym poziomie niż teraz.
Może to być również spowodowane, jeśli Twój Model używa SelectList, ponieważ nie ma konstruktora bez parametrów :
Będziesz musiał zrefaktoryzować swój model, aby zrobić to w inny sposób, jeśli taka jest przyczyna. Więc używając
IEnumerable<Contact>
i pisząc metodę rozszerzenia, która tworzy rozwijaną listę z różnymi definicjami właściwości:Lub możesz użyć podejścia @Mark i @krilovich, wystarczy zamienić SelectList na IEnumerable, działa również z MultiSelectList.
źródło
Potrzebujesz akcji, która odpowiada kontrolerowi, aby nie miała parametru.
Wygląda na to, że masz kombinację kontrolera i akcji:
ale potrzebujesz
Sprawdź także Route Debugger Phila Haacka, aby rozwiązać problemy z trasami.
źródło
Domyślnie kontrolery MVC wymagają domyślnego konstruktora bez parametrów. Najprościej byłoby stworzyć domyślny konstruktor, który wywoła ten z parametrami:
Możesz jednak zastąpić tę funkcję, zmieniając własną
ControllerFactory
. W ten sposób możesz powiedzieć MVC, że podczas tworzeniaMyController
instancjiHelper
.Pozwala to na używanie struktur Dependency Injection z MVC i naprawdę oddziela wszystko. Dobry przykład tego znajduje się na stronie StructureMap . Cały przewodnik Szybki start jest dobry, a na samym dole w sekcji „Auto Wiring” jest specyficzny dla MVC.
źródło
Ten błąd występuje również podczas korzystania z IDependencyResolver , na przykład w przypadku korzystania z kontenera IoC, a mechanizm rozpoznawania zależności zwraca null. W tym przypadku ASP.NET MVC 3 domyślnie używa DefaultControllerActivator do utworzenia obiektu. Jeśli tworzony obiekt nie ma publicznego konstruktora no-args, wyjątek zostanie zgłoszony za każdym razem, gdy podany mechanizm rozpoznawania zależności zwróci wartość null.
Oto jeden taki ślad stosu:
źródło
Możesz uzyskać ten wyjątek w wielu różnych miejscach we frameworku MVC (np. Nie może stworzyć kontrolera lub nie może stworzyć modelu, który da ten kontroler).
Jedynym prostym sposobem zdiagnozowania tego problemu jest zastąpienie MVC jak najbliżej wyjątku własnym kodem. Następnie kod zostanie uszkodzony w programie Visual Studio, gdy wystąpi ten wyjątek, i można odczytać typ powodujący problem ze śladu stosu.
Wydaje się to okropnym sposobem rozwiązania tego problemu, ale jest bardzo szybkie i bardzo spójne.
Na przykład, jeśli ten błąd występuje wewnątrz MVC DefaultModelBinder (który poznasz, sprawdzając ślad stosu), zastąp DefaultModelBinder tym kodem:
I zaktualizuj swój Global.asax.cs:
Teraz następnym razem, gdy otrzymasz ten wyjątek, program Visual Studio zatrzyma się w klasie MyDefaultModelBinder i możesz sprawdzić właściwość „modelType”, aby zobaczyć, jaki typ spowodował problem.
Powyższy przykład działa tylko wtedy, gdy podczas wiązania modelu zostanie wyświetlony wyjątek „Brak konstruktora bez parametrów zdefiniowanego dla tego obiektu”. Ale podobny kod można napisać dla innych punktów rozszerzeń w MVC (np. Konstrukcja kontrolera).
źródło
Otrzymałem ten sam błąd, winowajcą w moim przypadku był konstruktor, który nie był ani publiczny, ani prywatny .
Kod repro: upewnij się, że konstruktor ma przed sobą public.
źródło
Pierwszy film na http://tekpub.com/conferences/mvcconf
47:10 minut pokazuje błąd i pokazuje, jak zastąpić domyślny ControllerFactory. To znaczy stworzyć fabrykę kontrolera mapy struktury.
Zasadniczo prawdopodobnie próbujesz zaimplementować wstrzykiwanie zależności?
Problem w tym, że jest to zależność interfejsu.
źródło
Otrzymałem ten sam błąd, gdy:
Używając niestandardowego ModelView, obie akcje (GET i POST) przekazały ModelView, który zawierał dwa obiekty:
POST akceptuje również ten sam widok modelu:
Problem polegał na tym, że widok otrzymał ModelView (wymagał zarówno produktu, jak i listy informacji o kategoriach), ale po przesłaniu zwracał tylko obiekt Product, ale ponieważ POST Add spodziewał się ProductModelView, przekazał NULL, ale konstruktor ProductModelView tylko wymagał dwóch parametrów ( Product, RootCategories), następnie próbował znaleźć innego konstruktora bez parametrów dla tego przypadku o wartości NULL, a następnie zakończył się niepowodzeniem z komunikatem „bez parametrów ...”
Tak więc naprawienie POST Add w następujący sposób naprawi problem:
Mam nadzieję, że to może komuś pomóc (spędziłem prawie pół dnia, aby się tego dowiedzieć!).
źródło
To samo dla mnie. Mój problem pojawił się, ponieważ zapomniałem, że moja klasa modelu bazowego ma już właściwość o nazwie, która została zdefiniowana w widoku .
... i model przetwarzania przez administratora:
Nic specjalnego, prawda? Ale potem definiuję widok ...
... co powoduje błąd „Konstruktor bez parametrów” w żądaniu POST.
Mam nadzieję, że to pomoże.
źródło
Miałem podobny problem i w zasadzie chodzi o to, że w metodzie akcji są argumenty, które nie zostały dostarczone przez proces wiązania modelu (innymi słowy te pola nie zostały przesłane przez stronę wysyłającą).
Ten problem pojawi się, nawet jeśli zostaną podane wszystkie argumenty oprócz jednego, a nawet jeśli brakujący jest typem dopuszczającym wartość null.
Problem może również wynikać z literówki, w której nazwa argumentu i nazwa pola formularza nie będą identyczne.
Rozwiązaniem jest 1) sprawdzenie, czy nazwy są zgodne 2) podanie wartości domyślnej dla argumentu 3) lub podanie innej metody akcji bez tego argumentu.
źródło
Miałem również ten problem i pomyślałem, że się nim podzielę, ponieważ nie mogę znaleźć mojego problemu powyżej.
To był mój kod
return RedirectToAction("Overview", model.Id);
Nazywanie tego ActionResult:
public ActionResult Overview(int id)
Założyłem, że byłoby wystarczająco sprytnie, aby dowiedzieć się, że wartość, którą przekazuję, jest parametrem id dla Przeglądu, ale tak nie jest. To naprawiło:
return RedirectToAction("Overview", new {id = model.Id});
źródło
Otrzymałem ten sam wyjątek, ponieważ nie było publicznego konstruktora bez parametrów
Kod wyglądał tak:
zmienić na
problem rozwiązany do mnie.
źródło
Wszystkie odpowiedzi mówią o stworzeniu konstruktora bez parametrów, co nie jest idealne, jeśli nie chcesz, aby inni deweloperzy go używali, a tylko spinacz modelu.
Atrybut
[Obsolete("For model binding only", true)]
powyżej publicznego konstruktora spowoduje zgłoszenie błędu kompilatora, jeśli inny programista spróbuje tego użyć. Wieki zajęło mi znalezienie tego, mam nadzieję, że to komuś pomoże.źródło
Mam ten błąd. Używałem interfejsów w moim konstruktorze i mój program do rozpoznawania zależności nie był w stanie rozwiązać, kiedy go zarejestrowałem, błąd zniknął.
źródło
Miałem ten sam problem ...
Jeśli używasz interfejsu do oddzielenia połączenia od swojego DbContext (tak jak ja), możesz użyć structuremap.mvc (3 lub 4 - pakiet nudget ), aby móc użyć konstrukcji w klasie kontrolera. W ten sposób otrzymasz folder DependencyResolution. Po prostu zmień skomentowaną linię za pomocą For <InterfaceClass> () i użyj <DbContextClass> ().
źródło
Chociaż może to być oczywiste dla niektórych, przyczyną tego błędu było dla mnie to, że moja metoda MVC była powiązana z modelem, który zawierał właściwość typu
Tuple<>
.Tuple<>
nie ma konstruktora bez parametrów.źródło
Miałem ten sam problem, ale później odkryłem, że dodanie nowego interfejsu i odpowiedniej klasy wymaga zarejestrowania go w module inicjalizowalnym w celu wstrzyknięcia zależności. W moim przypadku był to kod wewnętrzny w następujący sposób:
}
źródło
W moim przypadku moja klasa miała
[Serializable]
atrybut.Musisz mieć konstruktora, który nie przyjmuje parametrów, jeśli twoja klasa to
[Serializable]
źródło
Ten błąd zaczął się dla mnie, kiedy dodałem nowy sposób tworzenia wystąpienia klasy.
Przykład:
Błąd został rozwiązany, gdy dodałem, kiedy wprowadziłem tę zmianę, dodając konstruktor bez parametrów. Uważam, że kompilator domyślnie tworzy konstruktor bez parametrów, ale jeśli dodasz własny, musisz go jawnie utworzyć.
źródło
Dodałem
DropDownList
do mojego formularza, jednak w moim przypadku nie był (i nie był przeznaczony) przesłany wraz z formularzem, ponieważ znajdował się poza<form></form>
tagami:Ponieważ Model zawierał pole tylko do wyświetlenia, spowodowało to również
No parameterless constructor defined for this object
błąd, ponieważ pole w ogóle nie zostało przesłane.W tym przypadku naprawiłem to, dodając powiązanie wykluczające:
źródło
Zdarzyło mi się to, a wyniki na tej stronie były dobrym źródłem, które poprowadziło mnie w wielu kierunkach, ale chciałbym dodać inną możliwość:
Jak stwierdzono w innych odpowiedziach, utworzenie konstruktora z parametrami powoduje usunięcie niejawnego konstruktora bez parametrów, więc należy go jawnie wpisać.
Mój problem polegał na tym, że konstruktor z domyślnymi parametrami również wyzwolił ten wyjątek.
Daje błędy:
Pracuje:
źródło
Najprawdopodobniej możesz mieć sparametryzowany konstruktor w swoim kontrolerze i jakikolwiek używany przez ciebie mechanizm rozpoznawania zależności nie jest w stanie poprawnie rozwiązać zależności. Musisz umieścić punkt przerwania, w którym zapisana jest metoda rozpoznawania zależności, a otrzymasz dokładny błąd w wyjątku wewnętrznym.
źródło
Miałem ten sam problem.
Po prostu usunięto
HttpFileCollectionBase files
z argumentu metody Post Action i dodano jakHttpFileCollectionBase files = Request.Files;
w treści metody.źródło
Dodałem konstruktora bez parametrów do modelu wewnątrz folderu DOMAIN i problem został rozwiązany.
źródło
Więc otrzymałem tę wiadomość również wcześniej, podczas wykonywania połączenia AJAX. Więc to, o co w zasadzie prosi, to konstruktor w tej klasie modelu, który jest wywoływany przez kontroler, nie ma żadnego parametru.
Oto przykład
źródło