[asp.net-mvc] ASP.NET MVC :이 개체에 대해 매개 변수가없는 생성자가 정의되어 있지 않습니다

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

나는 Steven Sanderson의 ‘ Pro ASP.NET MVC Framework ‘책 을 따르고있었습니다 . 필자의 권장 사항에 따라 132 페이지에서 ASP.NET MVC Futures 어셈블리를 다운로드하여 MVC 프로젝트에 추가했습니다. [참고 : 이것은 붉은 청어 일 수 있습니다.]

그 후에는 더 이상 프로젝트를로드 할 수 없습니다. 위의 오류로 인해 차가워졌습니다.

내 질문은 “내 코드를 수정하도록 도와 줄 수 있습니까?” 가 아닙니다 .

대신 더 일반적으로 알고 싶습니다.

  • 이 문제를 어떻게 해결해야합니까?
  • 무엇을 찾아야합니까?
  • 근본 원인은 무엇입니까?

지금보다 더 깊이있는 라우팅과 컨트롤러를 이해해야 할 것 같습니다.



답변

방금 비슷한 문제가있었습니다. 동일한 예외가 발생할 때Model매개 변수가없는 생성자가없는 .

콜 스택은 모델의 새 인스턴스 생성을 담당하는 메소드를 파악했습니다.

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


다음은 샘플입니다.

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


답변

이것은 매개 변수가없는 생성자가 없으므로 모델에서 SelectList를 사용하는 경우에도 발생할 수 있습니다 .

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

이것이 원인 인 경우 다른 방법으로 모델을 리팩터링해야합니다. 따라서 IEnumerable<Contact>다른 속성 정의로 드롭 다운 목록을 만드는 확장 메소드를 사용하고 작성하십시오.

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

또는 @Mark 및 @krilovich 방식을 사용할 수 있습니다. SelectList를 IEnumerable로 바꾸면됩니다. MultiSelectList에서도 작동합니다.

 public class MyViewModel
    {
        public Contact SelectedContact { get;set; }
        public IEnumerable<SelectListItem> Contacts { get;set; }
    }


답변

파라미터가없는 컨트롤러에 해당하는 조치가 필요합니다.

가지고있는 컨트롤러 / 액션 조합은 다음과 같습니다.

public ActionResult Action(int parameter)
{

}

하지만 당신은 필요합니다

public ActionResult Action()
{

}

또한 Phil Haack의 Route Debugger 를 확인하여 경로 문제를 해결하십시오.


답변

기본적으로 MVC 컨트롤러에는 매개 변수가없는 기본 생성자가 필요합니다. 가장 간단한 방법은 매개 변수가있는 생성자를 호출하는 기본 생성자를 만드는 것입니다.

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

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

그러나 자신의 롤링하여이 기능을 재정의 할 수 있습니다 ControllerFactory. 이 방법으로 MVC MyController에게 인스턴스를 만들 때 인스턴스를 제공 한다고 알릴 수 있습니다 Helper.

이를 통해 MVC와 함께 Dependency Injection 프레임 워크를 사용하고 실제로 모든 것을 분리 할 수 ​​있습니다. 이것의 좋은 예는 StructureMap 웹 사이트 에서 끝났습니다 . 전체 퀵 스타트가 양호하고 “자동 배선”에서 MVC를 바닥으로 향하게됩니다.


답변

이 오류는 IDependencyResolver를 사용할 때도 발생합니다 IoC 컨테이너를 사용할 때와 같이 하며 종속성 해결 프로그램이 널을 리턴합니다. 이 경우 ASP.NET MVC 3은 기본적으로 DefaultControllerActivator를 사용하여 개체를 만듭니다. 작성중인 오브젝트에 인수없는 공용 생성자가없는 경우 제공된 종속성 분석기가 널을 리턴 할 때마다 예외가 발생합니다.

이러한 스택 추적 중 하나가 있습니다.

[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


답변

MVC 프레임 워크의 여러 위치에서이 예외가 발생할 수 있습니다 (예 : 컨트롤러를 만들 수 없거나 해당 컨트롤러에 모델을 만들 수 없음).

이 문제를 진단하는 가장 쉬운 방법은 자신의 코드로 가능한 한 예외에 가깝게 MVC를 재정의하는 것입니다. 그런 다음이 예외가 발생하면 Visual Studio에서 코드가 중단되고 스택 추적에서 문제를 일으키는 Type을 읽을 수 있습니다.

이것은이 문제에 접근하는 끔찍한 방법처럼 보이지만 매우 빠르고 일관성이 있습니다.

예를 들어, MVC DefaultModelBinder 내에서이 오류가 발생하면 (스택 추적을 확인하여 알 수 있음) DefaultModelBinder를이 코드로 바꾸십시오.

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

그리고 Global.asax.cs를 업데이트하십시오 :

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

다음에이 예외가 발생하면 Visual Studio가 MyDefaultModelBinder 클래스 내부에서 중지되고 “modelType”속성을 확인하여 문제를 일으킨 유형을 확인할 수 있습니다.

위의 예제는 모델 바인딩 중 “이 객체에 대해 매개 변수없는 생성자가 정의되지 않았습니다”예외가 발생하는 경우에만 작동합니다. 그러나 MVC의 다른 확장 점 (예 : 컨트롤러 구성)에 대해 유사한 코드를 작성할 수 있습니다.


답변

같은 오류가 발생했습니다. 제 경우 범인은 public 또는 private이 아닌 생성자 였습니다 .

이 객체에 대해 매개 변수가없는 생성자가 정의되어 있지 않습니다.

예외 정보 : System.MissingMethodException :이 개체에 대해 매개 변수가없는 생성자가 정의되어 있지 않습니다.

재현 코드 : 생성자가 공개하기 전에 확인하십시오.

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

    public string name
    {
        get;
        set;
    }
}