2015-05-25 82 views
1

这是我的情况: 我有一个非常简单的MVC4应用程序。一种观点,一名管制员,责任有限。它的功能是作为一个供应商的应用程序的登录页面,并负责:ASP.Net MVC4使用Ninject,HttpPost返回'无参数构造函数'

  1. 读取用户
  2. 从供应商应用程序的数据库读取用户的成员资格的ActiveDirectory性能
  3. 如果会员用户不不存在的,通过添加用户确认会员条目,然后重定向到供应商的应用程序
  4. 如果会员不存在,显示的链接,允许用户通过点击向供应商申请

我遇到了#3的问题,但只是因为我已经将Ninject添加到项目中(需要依赖注入来允许单元测试写入)。从那以后,我为HTTP Post控制器动作获取了“为该对象定义的无参数构造函数”,并且只有后。 GET在这个控制器上工作得很好。这个控制器只有一个构造函数,并且它成功调用GET或POST - 添加一个断点,我可以逐步调用构造函数,并且只有在传递最后一个大括号之后,才会获得“无参数构造函数”错误。

我试过的解决方案在这些StackOverflow的答案: https://stackoverflow.com/a/14027722/1139007

https://stackoverflow.com/a/17909609/1139007

https://stackoverflow.com/a/21010851/1139007

我已确保我的所有绑定都在NinjectWebCommon.cs(他们是)正确设置。我已验证(根据this answer)Web.Config具有正确的配置。我已经卸载并重新安装Ninject.MVC3(和所有依赖项)。我正在拉我的头发。

这里的默认构造:

public HomeController(IAlerts alertRepository, IStore storeRepository, IMemberRecord memberRepository, IHTTPUserRequest userRequest, IActiveDirectory ad) 
    { 
     _alertRepository = alertRepository; 
     _storeRepository = storeRepository; 
     _memberRepository = memberRepository; 
     _userRequest = userRequest; 
     _ad = ad; 
    } 

这里的HttpPost控制器动作:

[HttpPost] 
    public HttpStatusCodeResult InsertMember(AVMemberRecord profile) 
    { 
     bool validStore = _storeRepository.isValidStore(profile.defaultStoreBU); 

     if (validStore) 
     { 
      bool success = _memberRepository.insertMemberRecord(profile); 

      if (success) 
      { 
       return new HttpStatusCodeResult(200); 
      } 
      else 
      { 
       return new HttpStatusCodeResult(500, "Error inserting Member record. Please open a ticket to request access."); 
      } 
     } 
     else 
     { 
      return new HttpStatusCodeResult(500, "Invalid store association for user. Please open a ticket to request access."); 
     } 


    } 

储存库分别具有接受IDataAccess的实例作为一个参数的构造函数:

public StoreRepository(IDataAccess db) 
    { 
     _db = db; 
     stores = db.getStores(); 
    } 

绑定到IDataAccess的DataAccess类只有一个参数的构造函数,并利用web.config文件中有关其连接字符串:

public DataAccess() 
    { 
     this.connectionString = ConfigurationManager.ConnectionStrings["DEV_ConnectionString"].ToString(); 
    } 

在NinjectWebCommon.cs的绑定:

private static void RegisterServices(IKernel kernel) 
    { 
     kernel.Bind<IDataAccess>().To<DataAccess>(); 
     kernel.Bind<IActiveDirectory>().To<ActiveDirectory>(); 
     kernel.Bind<IStore>().To<StoreRepository>(); 
     kernel.Bind<IMemberRecord>().To<MemberRepository>(); 
     kernel.Bind<IAlerts>().To<AlertRepository>(); 
     kernel.Bind<IHTTPUserRequest>().To<HTTPUserRequest>(); 
    } 

任何建议或指导,以什么我应该寻找在这里?如果这种情况持续太久,我可能会重构整个项目来摧毁Ninject(不幸的是,会丢失许多单元测试)。

编辑:完整的错误被要求在评论中,所以我会在这里包括。

[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, StackCrawlMark& stackMark) +113 System.RuntimeType.CreateInstanceDefaultCtor(Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache, StackCrawlMark& stackMark) +232 System.Activator.CreateInstance(Type type, Boolean nonPublic) +83 System.Activator.CreateInstance(Type type) +66 System.Web.Mvc.DefaultModelBinder.CreateModel(ControllerContext controllerContext, ModelBindingContext bindingContext, Type modelType) +183 System.Web.Mvc.DefaultModelBinder.BindComplexModel(ControllerContext controllerContext, ModelBindingContext bindingContext) +564 System.Web.Mvc.DefaultModelBinder.BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) +416 System.Web.Mvc.ControllerActionInvoker.GetParameterValue(ControllerContext controllerContext, ParameterDescriptor parameterDescriptor) +317 System.Web.Mvc.ControllerActionInvoker.GetParameterValues(ControllerContext controllerContext, ActionDescriptor actionDescriptor) +117 System.Web.Mvc.Async.<>c__DisplayClass25.<BeginInvokeAction>b__1e(AsyncCallback asyncCallback, Object asyncState) +446 System.Web.Mvc.Async.WrappedAsyncResult1.Begin(AsyncCallback callback, Object state, Int32 timeout) +130 System.Web.Mvc.Async.AsyncControllerActionInvoker.BeginInvokeAction(ControllerContext controllerContext, String actionName, AsyncCallback callback, Object state) +302 System.Web.Mvc.&lt;&gt;c__DisplayClass1d.&lt;BeginExecuteCore&gt;b__17(AsyncCallback asyncCallback, Object asyncState) +30 System.Web.Mvc.Async.WrappedAsyncResult1.Begin(AsyncCallback callback, Object state, Int32 timeout) +130 System.Web.Mvc.Controller.BeginExecuteCore(AsyncCallback callback, Object state) +381 System.Web.Mvc.Async.WrappedAsyncResult1.Begin(AsyncCallback callback, Object state, Int32 timeout) +130 System.Web.Mvc.Controller.BeginExecute(RequestContext requestContext, AsyncCallback callback, Object state) +317 System.Web.Mvc.Controller.System.Web.Mvc.Async.IAsyncController.BeginExecute(RequestContext requestContext, AsyncCallback callback, Object state) +15 System.Web.Mvc.&lt;&gt;c__DisplayClass8.&lt;BeginProcessRequest&gt;b__2(AsyncCallback asyncCallback, Object asyncState) +71 System.Web.Mvc.Async.WrappedAsyncResult1.Begin(AsyncCallback callback, Object state, Int32 timeout) +130 System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContextBase httpContext, AsyncCallback callback, Object state) +249 System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContext httpContext, AsyncCallback callback, Object state) +49 System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.BeginProcessRequest(HttpContext context, AsyncCallback cb, Object extraData) +16 System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +301 System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +155

+0

可以请你发布整个异常:消息,堆栈跟踪(包括内部异常,如果有的话)。 – BatteryBackupUnit

回答

1

你需要确保所有绑定的具体类有一个构造函数。 在这种情况下,它看起来好像是歹徒将是ActiveDirectory和/或HTTPUserRequest

只需为每个构造函数添加一个无参数的构造函数,并且应该解决错误。即:当有一个具体的类没有构造,所以这种情况并不少见

public class ActiveDirectory : IActiveDirectory 
{ 
    public ActiveDirectory() {} 
    .... 

} 

大部分(如果不是全部)DI发动机将抛出此异常。

更新

Ninject是不是在这种情况下问题,下面亮点AVMemberRecord的罪魁祸首类,它被用作对Post行动paramater @ ascary的意见。在这种情况下抛出异常,因为Model Binder找不到无参构造函数来实例化类型。

+0

对于ninject,情况并非如此。 – BatteryBackupUnit

+0

同样,这些类都是为Index控制器动作和POST动作(InsertMember)实例化的,但错误只发生在POST上。 – ascary

+0

我怀疑是这种情况,但是就像任何好的问题排查工具一样,我经历了这些步骤来证明或反驳。这是 - 这绝对让我感到困惑 - ** AVMemberRecord类**,一个被传递到POST的控制器动作,缺少构造函数。谢谢。 – ascary