web-dev-qa-db-ja.com

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

私はスティーブン・サンダーソンの「 Pro ASP.NET MVC Framework 」という本をフォローしていました。 132ページで、著者の推奨に従って、ASP.NET MVC Futures Assemblyをダウンロードし、MVCプロジェクトに追加しました。 [注:これはニシンの可能性があります。]

この後、プロジェクトをロードできなくなりました。上記のエラーにより風邪をひきました。

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

代わりに、私はもっと一般的に知りたい:

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

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

162
Jim G.

同様の問題がありました。 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
    {
    }
}
212
SandRock

これは、モデルが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; }
    }
84
Chris S

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

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

public ActionResult Action(int parameter)
{

}

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

public ActionResult Action()
{

}

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

22
Martin

デフォルトでは、MVCコントローラーにはパラメーターのないデフォルトコンストラクターが必要です。最も簡単なのは、パラメータ付きでコンストラクタを呼び出すデフォルトのコンストラクタを作成することです。

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

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

ただし、独自のControllerFactoryをローリングすることにより、この機能をオーバーライドできます。この方法で、MVCにMyControllerを作成するときにHelperのインスタンスを与えることができます。

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

20
swilliams

このエラーは、IoCコンテナーを使用する場合など、 IDependencyResolver を使用する場合にも発生し、依存関係リゾルバーはnullを返します。この場合、ASP.NET MVC 3はデフォルトでDefaultControllerActivatorを使用してオブジェクトを作成します。作成されるオブジェクトに引数なしのパブリックコンストラクターがない場合、提供された依存関係リゾルバーが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
17
Kaleb Pederson

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

13
Josh Mouch

私は同じエラーを受け取りました、私の場合の犯人はコンストラクタでしたパブリックでもプライベートでもありませんでした

このオブジェクトには、パラメータなしのコンストラクタは定義されていません。

例外の詳細:System.MissingMethodException:このオブジェクトに対してパラメーターなしのコンストラクターは定義されていません。

再現コード:コンストラクターの前にpublicがあることを確認してください。

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

    public string name
    {
        get;
        set;
    }
}
8
Hammad Khan

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

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

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

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

7
Dan B

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

カスタム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の場合にパラメーターのない別のコンストラクターを見つけようとし、「no parameterles ...」で失敗しました

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

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

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

6
Nestor

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

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

この問題は、入力ミスの結果である可能性もあります。この場合、引数の名前とフォームフィールドの名前は同一ではありません。

解決策は、1)名前が一致することを確認する2)引数にデフォルト値を提供する3)またはこの引数なしで別のアクションメソッドを提供することです。

5
yoel halb

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

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リクエストで「パラメータレスコンストラクター」エラーが発生します。

お役に立てば幸いです。

5
Anonymous

私もこの問題を抱えており、上記の問題を見つけることができないため、共有したいと思いました。

これは私のコードでした

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

このActionResultの呼び出し:

public ActionResult Overview(int id)

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

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

4
Brik

パラメータなしのパブリックコンストラクターがないため、同じ例外が発生しました

コードは次のようなものでした:

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

変更後

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

問題は解決しました。

4

このエラーが発生しました。コンストラクターでインターフェイスを使用しており、依存関係リゾルバーは解決できませんでした。登録するとエラーがなくなりました。

2
Ahmed

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

2
Tyler Forsythe

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

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

2
JeppePepp

答えはすべて、パラメーターを使用しないコンストラクターを作成するというもので、他の開発者がモデルバインダーのみを使用することを望まない場合は理想的ではありません。

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

2
Martin Dawson

おそらく、コントローラーにパラメーター化されたコンストラクターがあり、使用している依存関係リゾルバーが依存関係を適切に解決できない可能性があります。依存関係リゾルバーメソッドが書き込まれる場所にブレークポイントを配置する必要があり、内部例外で正確なエラーを取得します。

0
Mahendra Savale

同じ問題がありました。

アクション後のメソッド引数からHttpFileCollectionBase filesを削除し、メソッド本体にHttpFileCollectionBase files = Request.Files;のように追加しました。

0
Muhammad Yasir

DropDownListをフォームに追加しましたが、私の場合は、<form></form>タグの外側にあるため、フォームでは送信されませんでした(および送信するつもりもありませんでした)。

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

モデルには表示専用のフィールドが含まれていたため、フィールドがまったく送信されなかったため、これによりNo parameterless constructor defined for this objectエラーも発生しました。

この場合、除外バインディングを追加して修正しました。

public ActionResult Foo(int id, int? page, [Bind(Exclude = "MyField")]MyModel model)
0
SilverlightFox

私の場合、クラスには[Serializable]属性がありました。

クラスが[Serializable]の場合、パラメーターを受け取らないコンストラクターが必要です。

0
Kolob Canyon

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

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

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

エラーが発生します:

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

作品:

public CustomerWrapper(CustomerDto customer){...}
public CustomerWrapper():this(null){}

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

例:

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

私は同じ問題を抱えていましたが、後で新しいインターフェイスと対応するクラスを追加すると、依存関係注入のために初期化可能モジュールの下に登録する必要があることがわかりました。私の場合、次のようなコード内にありました。

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

}

0
arokanika