2008-12-01 15 views
13

callstack zawiera następujące informacje:Błąd serwera w aplikacji "/". Nie zdefiniowano konstruktora bez parametrów dla tego obiektu

[MissingMethodException: No parameterless constructor defined for this object.] 
System.RuntimeTypeHandle.CreateInstance(RuntimeType type, Boolean publicOnly, Boolean noCheck, Boolean& canBeCached, RuntimeMethodHandle& ctor, Boolean& bNeedSecurityCheck) +0 
System.RuntimeType.CreateInstanceSlow(Boolean publicOnly, Boolean fillCache) +86 
System.RuntimeType.CreateInstanceImpl(Boolean publicOnly, Boolean skipVisibilityChecks, Boolean fillCache) +230 
System.Activator.CreateInstance(Type type, Boolean nonPublic) +67 
System.Activator.CreateInstance(Type type) +6 
System.Web.Mvc.DefaultModelBinder.CreateModel(ModelBindingContext bindingContext, Type modelType) +277 
System.Web.Mvc.<>c__DisplayClass1.<BindModel>b__0() +98 
System.Web.Mvc.ModelBindingContext.get_Model() +51 
System.Web.Mvc.DefaultModelBinder.BindModelCore(ModelBindingContext bindingContext) +2600 
System.Web.Mvc.DefaultModelBinder.BindModel(ModelBindingContext bindingContext) +1067 
System.Web.Mvc.DefaultModelBinder.BindProperty(ModelBindingContext parentContext, Type propertyType, Func`1 propertyValueProvider, String propertyName) +208 
System.Web.Mvc.DefaultModelBinder.BindModelCore(ModelBindingContext bindingContext) +1787 
System.Web.Mvc.DefaultModelBinder.BindModel(ModelBindingContext bindingContext) +1067 
System.Web.Mvc.ControllerActionInvoker.GetParameterValue(ParameterInfo parameterInfo) +355 
System.Web.Mvc.ControllerActionInvoker.GetParameterValues(MethodInfo methodInfo) +439 
System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext, String actionName) +288 
System.Web.Mvc.Controller.ExecuteCore() +180 
System.Web.Mvc.ControllerBase.Execute(RequestContext requestContext) +96 
System.Web.Mvc.ControllerBase.System.Web.Mvc.IController.Execute(RequestContext requestContext) +36 
System.Web.Mvc.MvcHandler.ProcessRequest(HttpContextBase httpContext) +377 
System.Web.Mvc.MvcHandler.ProcessRequest(HttpContext httpContext) +71 
System.Web.Mvc.MvcHandler.System.Web.IHttpHandler.ProcessRequest(HttpContext httpContext) +36 
System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +181 
System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +75 

Mam mały formularz z bandą ukrytych pól i jeden przycisk wysyłania. Kiedy go wciskam, nigdy nie uderzyłem w żądaną metodę.

Jak mam kontynuować i debugować to? Byłby to wspaniały początek, gdybym wiedział, CO obiektu nie ma konstruktora bez parametrów. Gdzie jest ten obiekt? Jak mogę to rozwiązać? Wiem, że pytanie jest dość niejasne, ale obecnie to wszystko co mam ..

--EDIT--
W moim formularzu dodałem Html.Hidden() wejść. W zależności od poprzednich działań mogą one mieć wartość "". Akcja korzysta z ModelBinding. Ilekroć wartość wynosi "", a typem danych jest SelectList, modelbinder idzie na mnie.

Czuję się coraz bardziej nieswojo z tym, jak robi to SelectList ... Pomysł jest dobry, ale są pewne problemy.

+0

Jaki jest podpis czynności, którą próbujesz wywołać? –

+0

Czy dodać parametry do konstruktora kontrolera lub usunąć domyślny konstruktor na kontrolerze? –

+0

Todd, to nie problem. Spójrz na stos; kontroler został już utworzony. To jest model, prawdopodobnie jeden z argumentów do działania. –

Odpowiedz

7

Rozwiązałem problem, który jest spowodowany obiektem SelectList, ponieważ nie zapewnia on domyślnego konstruktora, więc nie możemy mieć programu ViewModel.

+0

Ic, dziękuję za odpowiedź :) –

1

Czy usunąłeś Default.aspx? To musi być na miejscu, aby poprawnie wykorzenić root. Może się to również zdarzyć, jeśli próbujesz użyć Dependency Injection, a twój kontener nie jest poprawnie skonfigurowany - co oznacza, że ​​nie ma kontrolera, który prosi DI Container o instancję.

+0

Nie, jest tam. Znalazłem przyczynę, ale jeszcze nie rozwiązanie. Proszę odnieść się do mojego oryginalnego postu. –

+1

To było to dla mnie, skopiowany kod z aplikacji WPF I testował i usunął IControllerFactory controllerFactory = \t \t \t \t \t nowy UnityControllerFactory (_container); \t \t \t ControllerBuilder.Current.SetControllerFactory (controllerFactory); – rball

6

Twoje własne klasy w argach akcji muszą mieć konstruktor bez parametrów, aby użyć domyślnego modułu wiążącego model. W przeciwnym razie (1) utwórz niestandardowy segregator modelu lub (2) przekaż prymitywne typy zamiast niestandardowych klas do Akcji.

+0

Dzięki za odpowiedź. To była pierwsza rzecz, którą sprawdziłem, ponieważ była to najbardziej oczywista rzecz, która mogła pójść nie tak. Mają ctor parles. Używam tych samych obiektów do końca mojej witryny z powodzeniem. –

6

Mam również właściwości w mojej klasie widoku widoku, które zwracają instancje SelectList. I zdobione moją klasę z atrybutem Bind, aby wykluczyć te właściwości tak:

[Bind(Exclude = "Countries")] public class MyViewModel { ...

public SelectList Countries { get; set; } 

}

nadzieję, że pomoże, Roger

+0

Tak więc wartości listy wyboru muszą zostać pobrane z kolekcji formularzy. –

+0

To bardzo mi pomogło. Dzięki! –

0

Korzeń mój problem był również SelectList.

miałem to:

<%: Html.DropDownListFor(m => Model.Destinations, Model.Destinations)%> 

Kiedy miałbym to:

<%: Html.DropDownListFor(m => Model.Destination, Model.Destinations)%> 

przeznaczenia jest wybór użytkownika, Kierunki lista możliwych wartości. Użycie podwójnej listy SelectList dwukrotnie spowodowało problem.

7

Dla tych Googling ten wyjątek, tutaj jest bardziej ogólny sposób, aby go zdiagnozować:

Jedyny łatwy sposób znalazłem w celu zdiagnozowania tego problemu jest przesłonić MVC tak blisko jak to możliwe, z wyjątkiem własnych kod. Wtedy Twój kod złamie się w Visual Studio, gdy wystąpi ten wyjątek, i możesz odczytać typ powodujący problem ze śledzenia stosu.

To wydaje się okropny sposób podejścia do tego problemu, ale jest bardzo szybki i bardzo spójny.

Na przykład, jeśli ten błąd występuje wewnątrz MVC DefaultModelBinder (które poznacie zaznaczając ślad stosu), a następnie zastąpić DefaultModelBinder z 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 zaktualizować 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 dostaniesz ten wyjątek, Visual Studio zatrzyma wewnątrz klasy MyDefaultModelBinder, można sprawdzić „modelType” właściwość, aby zobaczyć, jaki rodzaj spowodowało problem.

Powyższy przykład działa, gdy otrzymasz wyjątek "Bez parametrów bez parametrów zdefiniowany dla tego obiektu" tylko podczas wiązania modelu. Ale podobny kod można zapisać dla innych punktów rozszerzenia w MVC (na przykład konstrukcji kontrolera).

+0

Szukałem tego od bardzo dawna. Dziękuję Ci! Wszyscy: oszczędzaj czas i spróbuj tego w pierwszej kolejności. Nazwałem mój "DebuggableModelBinder" i zamierzam to skomentować z Global.asax.cs i zostawić go tam, gdy następnym razem to mnie ugryzie. –

Powiązane problemy