ASP.NET MVC: dla tego obiektu nie zdefiniowano żadnego konstruktora bez parametrów

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

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

Jim G.
źródło

Odpowiedzi:

226

Właśnie miałem podobny problem. Ten sam wyjątek występuje, gdy Modelnie ma konstruktora bez parametrów.

Stos wywołań wymyślał metodę odpowiedzialną za utworzenie nowej instancji modelu.

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


Oto próbka:

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
źródło
16
Podczas wysyłania danych JSON do mojej akcji otrzymywałem podobny błąd. Okazuje się, że mój model, z którym próbuje się połączyć, nie ma konstruktora bez parametrów!
Tim
1
Uwaga: mam tylko ten problem (bez parametrów bla bla ...) podczas serializacji, jeśli zdefiniuję konstruktora, a nie konstruktora bez parametrów. Chodzi mi o to, że w tym przykładzie, jeśli usuniesz zdefiniowany przez siebie konstruktor (publiczny MyModel (pomocnik IHelper) {}) problem znika ... więc za każdym razem, gdy tworzysz konstruktora, musisz utworzyć bez parametrów ... Rozumiem takie jak: gdy zaczniesz definiować konstruktora, system nie podejmuje ryzyka tworzenia „obiektów domyślnych”, ponieważ nie wie, czy ma to sens… coś takiego.
H_He
1
Krotki ... może dla innych osób, które tu przychodzą: jeśli masz tylko krotki (np. Tuple <string, string> data;) w swojej klasie, serializacja będzie w porządku (ponieważ napotkałem ten problem podczas serializacji JSON) ... ale jeśli używasz czegoś takiego jak List <Tuple <string, string >> data; zaczniesz mieć błąd „brak konstruktora bez parametrów”. Ponieważ .Net nie może / nie może tworzyć krotek (nie mam odniesienia do tego, ale Tuple <string, string> data = new Tuple <string, string> (); nie kompiluje się ... while Tuple <string, string> data = new Tuple <string, string> ("", ""); jest ok.
H_He
3
Tak, ale jak dodać konstruktor bez parametrów do klasy, która ma zależności i chcesz wstrzyknąć je do konstruktora? To jest część problemu, którego nie rozumiem ...
EluciusFTW
2
@ToaoG Twoja biblioteka wstrzykiwania zależności powinna umożliwić Ci wybranie „konstruktora wstrzykiwania”. Przy okazji, wstrzykiwanie zależności w modelach widoku wygląda dziwnie.
SandRock,
89

Może to być również spowodowane, jeśli Twój Model używa SelectList, ponieważ nie ma konstruktora bez parametrów :

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

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:

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

Lub możesz użyć podejścia @Mark i @krilovich, wystarczy zamienić SelectList na IEnumerable, działa również z MultiSelectList.

 public class MyViewModel
    {
        public Contact SelectedContact { get;set; }
        public IEnumerable<SelectListItem> Contacts { get;set; }
    }
Chris S.
źródło
1
Zmarnowałem na to tyle czasu ... i musiałem zmienić moją funkcję pomocniczą, która zwracała SelectList, na taką, która zwracałaby List <SelectListItem> .... blarg
Mark
Możesz użyć IEnumerable <SelectListItem> i utworzyć ich wystąpienie w swoim konstruktorze jako nowy List <SelectListItem> ()
krilovich
Dziękuję 3,5 roku później!
tonyapolis
Dziękuję, to było niezwykle pomocne!
Kevin Coulson
Nadal ważne 5 lat później. Dzięki!
Neill
23

Potrzebujesz akcji, która odpowiada kontrolerowi, aby nie miała parametru.

Wygląda na to, że masz kombinację kontrolera i akcji:

public ActionResult Action(int parameter)
{

}

ale potrzebujesz

public ActionResult Action()
{

}

Sprawdź także Route Debugger Phila Haacka, aby rozwiązać problemy z trasami.

Jaskółka oknówka
źródło
6
Wyjątek dotyczy Konstruktora, a nie metody akcji.
Jason Wicker,
4
@Logrythmik. Zgłoszony wyjątek dotyczy konstruktora, ale problem dotyczy metody akcji. Miałem klasę i metodę akcji, które działały, a następnie dodałem parametr do metody akcji i otrzymałem ten błąd. Alternatywnym rozwiązaniem jest podanie wartości parametru. Lub ustaw parametr jako opcjonalny - to powinno działać, gdy kontroler jest w C #, ale nie u mnie z F #
Stephen Hosking
Ponadto, jeśli robisz coś takiego jak @ Html.Action ("SomeAction", new {myParameter = "42"}), upewnij się, że nazwa parametru w wywołaniu Html.Action jest zgodna z nazwą parametru zdefiniowanego w Twoja metoda działania!
JT Taylor
20

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:

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

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

Możesz jednak zastąpić tę funkcję, zmieniając własną ControllerFactory. W ten sposób możesz powiedzieć MVC, że podczas tworzenia MyControllerinstancji Helper.

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.

swilliams
źródło
6
Nie sądzę, żeby to była poprawna odpowiedź, @swilliams. Kluczem jest tutaj część: zdefiniowana dla tego obiektu . To bzdurny komunikat o błędzie, który w rzeczywistości sugeruje, że przekazane MODELE WEJŚCIOWE nie mogą zostać utworzone. Więc jeśli masz model wejściowy, który nie ma konstruktora bez parametrów, pojawia się ten błąd. Bardzo łatwo pomyśleć, że było to związane z konstruktorem STEROWNIKA. Ale nie jest.
Pure.Krome
1
To bzdura wiadomość, która doprowadzi cię do dzikiej gęsi, gdyby nie takie odpowiedzi. Dzięki tej i powyższej odpowiedzi udało mi się załatwić sprawę. Myślę, że jest to kwestia niezrozumienia w pełni tego, co segregator robi za kulisami. Pomyślałem, że po prostu ustawi każdą właściwość, ale z jakiegoś powodu wywołuje również get przed ustawieniem podczas wysyłania. Tak więc, ponieważ przeładowałem mój konstruktor i musiałem skompensować konstruktor bez parametrów, musiałem uwzględnić wartości null, które pobiera niektóre z moich właściwości, co również było nieoczekiwane.
eaglei
18

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:

[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
źródło
2
To spowodowało mój problem: mój program do rozpoznawania zależności nie mógł skonstruować mojego kontrolera z powodu wyjątku. Został połknięty przez resolver, zwrócił wartość null, a struktura MVC została przełączona na domyślny aktywator kontrolera, co spowodowało opisany błąd.
Beriz
@ jmona789 Sprawdź, czy ustawiłeś wszystkie wstrzyknięte zależności w swoim Global.asax.
aloisdg przenosi się na codidact.com
13

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:

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

I zaktualizuj swój Global.asax.cs:

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

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

Josh Mouch
źródło
Właśnie o tym myślałem, aby rozwiązać mój problem.
Doug Chamberlain
Chciałbym móc to bardziej głosować. Zaoszczędziło mi więcej niż kilka minut mojego czasu.
Keith
8

Otrzymałem ten sam błąd, winowajcą w moim przypadku był konstruktor, który nie był ani publiczny, ani prywatny .

Nie zdefiniowano konstruktora bez parametrów dla tego obiektu.

Szczegóły wyjątku: System.MissingMethodException: dla tego obiektu nie zdefiniowano żadnego konstruktora bezparametrowego.

Kod repro: upewnij się, że konstruktor ma przed sobą public.

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

    public string name
    {
        get;
        set;
    }
}
Hammad Khan
źródło
4
Uwaga: brak modyfikatorów dostępu w konstruktorze domyślnie jest „wewnętrzny” w kompilatorze.
lsuarez
1
umieszczenie tam modyfikatora „prywatnego” nie rozwiąże problemu.
krzyski
7

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.

Dan B.
źródło
I możesz pobrać klasę StructureMapControllerFactory z projektu MVC Storefront
Gautam Jain
6

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:

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

POST akceptuje również ten sam widok modelu:

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

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:

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

Mam nadzieję, że to może komuś pomóc (spędziłem prawie pół dnia, aby się tego dowiedzieć!).

Nestor
źródło
Nestor, to jest pouczające i wydaje się poprawne. Ale dlaczego View zwraca inny obiekt niż odbiera, tj. Obiekt Product, a nie ProductViewModel?
GilShalit
Och, to było specyficzne dla mojego przypadku, ponieważ potrzebuję tylko zachować dane dla produktów, RootCategories zostały przekazane do widoku tylko w celu wydrukowania, nie wprowadzono żadnych danych wejściowych, więc ich wartości (RootCategories) nie były przechowywane w <input > lub gdziekolwiek indziej. Czy muszę zachować ten sam ViewModel, powinienem nadal używać formularza <input>, danych widoku lub czegoś innego.
Nestor
GilShalit, dzisiaj znalazłem odpowiedź (przepraszam, że jestem wolny!), Patrząc na renderowany HTML, zobaczyłem, że dane wejściowe przyjmują nazwę [ObjectName]. [Property], ale nie ma śladu oryginalnego ViewModel, więc możesz pobrać tylko każdą osobę obiekt wewnątrz ViewModel, ale nie cały ViewModel. Przykład: jeśli maszyna wirtualna ProductViewModel ma wewnątrz obiektów Product p i Category c, wówczas kontroler GET wysyła jeden model maszyny wirtualnej do widoku, a następnie kontroler POST może akceptować tylko parametry takie jak (produkt p, kategoria c), ale nie maszynę wirtualną. .. jeśli się mylę byłbym wdzięczny za informację zwrotną.
Nestor
5

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 .

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

... i model przetwarzania przez administratora:

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

Nic specjalnego, prawda? Ale potem definiuję widok ...

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

... co powoduje błąd „Konstruktor bez parametrów” w żądaniu POST.

Mam nadzieję, że to pomoże.

Anonimowy
źródło
5

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.

yoel halb
źródło
Dzięki @yo hal, Twoja odpowiedź okazała się tą, która rozwiązała mój konkretny przypadek tego błędu. Komunikat o błędzie, który wypluje framework, jest najmniej przydatnym komunikatem o błędzie, jaki kiedykolwiek pojawił się w tym przypadku.
Scott Lawrence
4

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

Brik
źródło
4

Otrzymałem ten sam wyjątek, ponieważ nie było publicznego konstruktora bez parametrów

Kod wyglądał tak:

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

zmienić na

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

problem rozwiązany do mnie.

Muru Bakthavachalam
źródło
Miałem ten sam problem, używając chronionego konstruktora w klasie bazowej - wydaje się teraz oczywistym rozwiązaniem!
keithl8041
4

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.

Martin Dawson
źródło
Idealnie - dodanie tego atrybutu umożliwiło działanie powiązania modelu MVC w czasie wykonywania i ustawienie parametru boolowskiego atrybutu na wartość true uniemożliwiło (w czasie kompilacji) wszelkie próby utworzenia wystąpienia konstruktora bez parametrów. Najlepsza odpowiedź tutaj.
Greg Trevellick
3

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ął.

Ahmed
źródło
Jeśli masz nowe pytanie, napisz je jako takie. Powinien to być komentarz lub nowe pytanie, ponieważ nie jest to próba odpowiedzi na problem.
Nahuel Ianni
2

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

JeppePepp
źródło
2

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.

Tyler Forsythe
źródło
1

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:

[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
źródło
1

W moim przypadku moja klasa miała [Serializable]atrybut.

Musisz mieć konstruktora, który nie przyjmuje parametrów, jeśli twoja klasa to [Serializable]

Kolob Canyon
źródło
0

Ten błąd zaczął się dla mnie, kiedy dodałem nowy sposób tworzenia wystąpienia klasy.

Przykład:

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

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

    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;
         }
     }
głaskanie pod brodę
źródło
0

Dodałem DropDownListdo mojego formularza, jednak w moim przypadku nie był (i nie był przeznaczony) przesłany wraz z formularzem, ponieważ znajdował się poza <form></form>tagami:

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

Ponieważ Model zawierał pole tylko do wyświetlenia, spowodowało to również No parameterless constructor defined for this objectbłąd, ponieważ pole w ogóle nie zostało przesłane.

W tym przypadku naprawiłem to, dodając powiązanie wykluczające:

public ActionResult Foo(int id, int? page, [Bind(Exclude = "MyField")]MyModel model)
SilverlightFox
źródło
0

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:

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

Pracuje:

public CustomerWrapper(CustomerDto customer){...}
public CustomerWrapper():this(null){}
Bendik August Nesbø
źródło
0

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.

Mahendra Savale
źródło
0

Miałem ten sam problem.

Po prostu usunięto HttpFileCollectionBase filesz argumentu metody Post Action i dodano jak HttpFileCollectionBase files = Request.Files;w treści metody.

Muhammad Yasir
źródło
0

Dodałem konstruktora bez parametrów do modelu wewnątrz folderu DOMAIN i problem został rozwiązany.

wprowadź opis obrazu tutaj

 public User()
        {

        }
Melodia
źródło
-3

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

public class MyClass{

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

 }
Carla
źródło
Usunąłem domyślnego konstruktora z modelu, to działa dla mnie.
Musakkhir Sayyed