179
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 プロジェクトに追加しました。[注: これはニシンかもしれません。]

この後、プロジェクトを読み込めなくなりました。上記のエラーにより、私は寒くなりました。

私の質問は、「私のコードを修正するのを手伝ってくれませんか?」ではありません。

代わりに、より一般的に知りたいです:

  • この問題のトラブルシューティング方法を教えてください。
  • 何を探すべきですか?
  • 根本的な原因は何ですか?

ルーティングとコントローラーを今よりも深いレベルで理解する必要があるようです。

4

27 に答える 27

233

私はちょうど同様の問題を抱えていました。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
    {
    }
}
于 2010-09-01T21:46:07.783 に答える
92

これは、モデルが 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; }
    }
于 2011-10-21T12:39:43.597 に答える
23

パラメーターを持たないコントローラーに対応するアクションが必要です。

あなたが持っているコントローラー/アクションの組み合わせのように見えます:

public ActionResult Action(int parameter)
{

}

しかし、あなたは必要です

public ActionResult Action()
{

}

また、Phil Haack のRoute Debuggerをチェックして、ルートのトラブルシューティングを行ってください。

于 2009-08-31T01:49:34.883 に答える
21

既定では、MVC コントローラーには、パラメーターのない既定のコンストラクターが必要です。最も簡単な方法は、パラメーターを持つコンストラクターを呼び出す既定のコンストラクターを作成することです。

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

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

ただし、独自の をローリングすることで、この機能をオーバーライドできますControllerFactoryMyControllerこのようにして、 を作成するときに のインスタンスを与えることを MVC に伝えることができますHelper

これにより、依存性注入フレームワークを MVC で使用でき、実際にすべてを切り離すことができます。これの良い例は、StructureMap の Web サイトにあります。全体のクイックスタートは良好で、「Auto Wiring」の一番下に向かって MVC に特化しています。

于 2009-08-31T01:54:06.687 に答える
21

このエラーは、IoC コンテナーを使用する場合など、 IDependencyResolverを使用する場合にも発生し、依存関係リゾルバーは null を返します。この場合、ASP.NET MVC 3 はデフォルトで、DefaultControllerActivator を使用してオブジェクトを作成します。作成中のオブジェクトに public no-args コンストラクターがない場合、提供された依存関係リゾルバーが null を返すたびに例外がスローされます。

そのようなスタック トレースの 1 つを次に示します。

[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
于 2011-10-03T21:19:27.477 に答える
14

この例外は、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 の他の拡張ポイント (コントローラーの構築など) についても同様のコードを記述できます。

于 2013-03-08T14:31:34.613 に答える
7

http://tekpub.com/conferences/mvcconfの最初のビデオ

47:10 分にエラーが表示され、デフォルトの ControllerFactory をオーバーライドする方法が示されます。つまり、構造マップ コントローラ ファクトリを作成します。

基本的に、おそらく依存性注入を実装しようとしていますか??

問題は、インターフェースの依存関係です。

于 2011-02-07T11:13:51.897 に答える
6

次の場合にも同じエラーが発生しました。

カスタムModelViewを使用して、両方のアクション(GETとPOST)が2つのオブジェクトを含むModelViewを渡していました。

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

また、POSTも同じモデルビューを受け入れます。

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

問題は、ビューがModelViewを受け取った(製品とカテゴリのリスト情報の両方が必要)が、送信後にProductオブジェクトのみを返していましたが、POST AddがProductModelViewを予期したため、NULLを渡しましたが、ProductModelViewのみのコンストラクターは2つのパラメーターを必要としました( Product、RootCategories)、次に、このNULLの場合、パラメーターのない別のコンストラクターを見つけようとしましたが、「パラメーターなし...」で失敗しました。

したがって、POST Addを次のように修正すると、問題が修正されます。

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

これが誰かを助けることができることを願っています(私はこれを見つけるためにほぼ半日を費やしました!)。

于 2010-10-13T14:15:01.257 に答える
5

私も同じです。ビューで定義された名前のプロパティがベースモデルクラスに既にあることを忘れていたため、問題が発生しました。

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

...およびコントローラー処理モデル:

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

特別なことはありませんよね?しかし、私はビューを定義します...

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

... POST リクエストで「パラメータのないコンストラクタ」エラーが発生します。

それが役立つことを願っています。

于 2011-08-31T10:20:25.977 に答える
5

同様の問題がありましたが、基本的には、モデル バインディング プロセスによって提供されなかった引数がアクション メソッドにいくつかあるということです (つまり、これらのフィールドは送信ページによって送信されませんでした)。

この問題は、1 つを除くすべての引数が指定されていても、欠落している引数が null 許容型であっても発生します。

この問題は、引数の名前とフォーム フィールドの名前が一致しないタイプミスの結果である可能性もあります。

解決策は、1) 名前が一致していることを確認する、2) 引数にデフォルト値を指定する、3) この引数を指定せずに別のアクション メソッドを指定する、のいずれかです。

于 2012-08-13T18:24:39.333 に答える
4

すべての回答は、他の開発者がそれを使用せず、モデルバインダーのみを使用したくない場合に理想的ではないパラメーターの少ないコンストラクターを作成することを示しています。

パブリック コンストラクターの上の属性[Obsolete("For model binding only", true)]は、別の開発者がこれを使用しようとすると、コンパイラ エラーをスローします。これを見つけるのに何年もかかりました。誰かの役に立てば幸いです。

于 2016-07-13T01:06:13.020 に答える
4

私もこの問題を抱えていて、上記の問題が見つからないので共有したいと思いました。

これは私のコードでした

return RedirectToAction("Overview", model.Id);

この ActionResult を呼び出す:

public ActionResult Overview(int id)

渡す値が概要の id パラメータであることを理解するのに十分賢いと思いましたが、そうではありません。これで修正されました:

return RedirectToAction("Overview", new {id = model.Id});

于 2011-11-08T08:40:33.363 に答える
2

私は同じ問題を抱えていました...

インターフェイスを使用して DbContext (私のように) との接続を分離する場合は、structuremap.mvc (3 または 4 - nudget package ) を使用して、コントローラー クラスでコンストラクトを使用できます。これにより、DependencyResolution フォルダーが作成されます。コメント行を For< InterfaceClass >() および Use< DbContextClass >() に変更するだけです。

于 2013-01-03T10:30:12.503 に答える
2

これは一部の人には明らかかもしれませんが、私にとってのこのエラーの原因は、私の MVC メソッドが type のプロパティを含むモデルにバインドされていたことTuple<>です。Tuple<>パラメーターなしのコンストラクターはありません。

于 2013-05-08T19:10:50.443 に答える
1

DOMAIN フォルダー内のモデルにパラメーターなしのコンストラクターを追加したところ、問題は解決しました。

ここに画像の説明を入力

 public User()
        {

        }
于 2020-06-30T07:57:31.043 に答える
0

これは私に起こりました.このページの結果は私を多くの方向に導く良いリソースでしたが、別の可能性を追加したいと思います:

他の返信で述べたように、パラメーターを使用してコンストラクターを作成すると、暗黙的なパラメーターなしのコンストラクターが削除されるため、明示的に入力する必要があります。

私の問題は、デフォルトのパラメーターを持つコンストラクターもこの例外をトリガーしたことでした。

エラーが発生します:

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

作品:

public CustomerWrapper(CustomerDto customer){...}
public CustomerWrapper():this(null){}
于 2015-07-22T14:52:56.313 に答える
0

ほとんどの場合、コントローラーにパラメーター化されたコンストラクターがあり、使用している依存関係リゾルバーが依存関係を適切に解決できない可能性があります。依存関係リゾルバー メソッドが記述されている場所にブレークポイントを配置する必要があり、内部例外で正確なエラーが発生します。

于 2015-12-12T16:42:33.483 に答える
0

このエラーは、クラスをインスタンス化する新しい方法を追加したときに始まりました。

例:

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

この変更を行ったときに追加し、パラメーターなしのコンストラクターを追加すると、エラーは解決しました。コンパイラーはデフォルトでパラメーターなしのコンストラクターを作成すると思いますが、独自のコンストラクターを追加する場合は、明示的に作成する必要があります。

    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;
         }
     }
于 2014-06-12T20:34:19.033 に答える
-3

そのため、ajax呼び出しを行うときに、以前にもそのメッセージを受け取りました。したがって、基本的に求めているのは、コントローラーによって呼び出されているモデルクラスのコンストラクターであり、パラメーターはありません。

ここに例があります

public class MyClass{

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

 }
于 2015-08-04T21:02:43.247 に答える