ASP.NET MVC: Tidak ada konstruktor tanpa parameter yang ditentukan untuk objek ini

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

Saya mengikuti buku ' Pro ASP.NET MVC Framework ' karya Steven Sanderson . Pada halaman 132, sesuai dengan rekomendasi penulis, saya mengunduh perakitan ASP.NET MVC Futures, dan menambahkannya ke proyek MVC saya. [Catatan: Ini bisa jadi herring merah.]

Setelah ini, saya tidak bisa lagi memuat proyek saya. Kesalahan di atas menghentikan saya dengan dingin.

Pertanyaan saya bukan , "Bisakah Anda membantu saya memperbaiki kode saya?"

Sebagai gantinya, saya ingin tahu lebih umum:

  • Bagaimana saya memecahkan masalah ini?
  • Apa yang harus saya cari?
  • Apa yang mungkin menjadi penyebab root?

Sepertinya saya harus memahami perutean dan pengontrol di tingkat yang lebih dalam daripada yang saya lakukan sekarang.

Jim G.
sumber

Jawaban:

226

Saya hanya punya masalah serupa. Pengecualian yang sama terjadi ketika a Modeltidak memiliki konstruktor tanpa parameter.

Tumpukan panggilan mencari metode yang bertanggung jawab untuk membuat contoh baru model.

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


Berikut ini contohnya:

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
    {
    }
}
SandRock
sumber
16
Ketika POSTing data JSON ke tindakan saya, saya mendapatkan kesalahan yang sama. Ternyata model saya yang ia coba ikat tidak memiliki konstruktor tanpa parameter!
Tim
1
NB: Saya hanya memiliki masalah ini (tidak ada bla tanpa parameter ...) selama serialisasi jika saya mendefinisikan konstruktor, dan bukan konstruktor tanpa parameter. Maksud saya, dalam contoh ini, jika Anda menghapus konstruktor yang Anda tentukan (MyModel publik (pembantu IHelper) {}) masalahnya hilang ... jadi setiap kali Anda membuat konstruktor, Anda harus membuat konstruktor tanpa parameter ... Saya bisa mengerti itu seperti: setelah Anda mulai mendefinisikan konstruktor, sistem tidak mengambil risiko untuk membuat 'objek default' karena tidak tahu apakah itu masuk akal ... sesuatu seperti itu.
H_He
1
Tuples ... mungkin untuk beberapa orang lain yang datang ke sini: jika Anda baru saja Tuples (seperti Tuple <string, string> data;) di kelas Anda, serialisasi akan baik-baik saja (karena saya mengalami masalah ini selama serialisasi JSON) ... tetapi jika Anda menggunakan sesuatu seperti List <Tuple <string, string >> data; Anda akan mulai mengalami kesalahan 'no parameterless contructor'. Karena .Net tidak bisa / tidak membuat Tuples (saya tidak punya referensi untuk itu tetapi Tuple <string, string> data = Tuple baru <string, string> (); tidak akan mengkompilasi ... sementara Tuple <string, string> data = Tuple baru <string, string> ("", ""); ok.
H_He
3
Ya, tetapi bagaimana Anda menambahkan konstruktor tanpa parameter ke kelas yang memiliki dependensi dan Anda ingin menyuntikkannya di konstruktor? Itu adalah bagian dari masalah yang tidak saya dapatkan ...
EluciusFTW
2
@ToaoG pustaka injeksi ketergantungan Anda harus memberi Anda cara untuk memilih "konstruktor injeksi". Btw, memiliki injeksi ketergantungan pada model tampilan tampak aneh.
SandRock
89

Ini juga dapat disebabkan jika Model Anda menggunakan SelectList, karena ini tidak memiliki konstruktor tanpa parameter :

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

Anda harus memperbaiki model Anda untuk melakukannya dengan cara yang berbeda jika ini penyebabnya. Jadi menggunakan IEnumerable<Contact>dan menulis metode ekstensi yang membuat daftar drop-down dengan definisi properti yang berbeda:

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

Atau Anda dapat menggunakan pendekatan @Mark dan @krilovich, hanya perlu mengganti SelectList ke IEnumerable, ini juga berfungsi dengan MultiSelectList.

 public class MyViewModel
    {
        public Contact SelectedContact { get;set; }
        public IEnumerable<SelectListItem> Contacts { get;set; }
    }
Chris S
sumber
1
Saya membuang banyak waktu untuk ini ... dan harus mengubah fungsi helper saya yang mengembalikan SelectList menjadi yang akan mengembalikan Daftar <SelectListItem> .... blarg
Mark
Anda dapat menggunakan IEnumerable <SelectListItem> dan instantiate mereka di konstruktor Anda sebagai Daftar baru <SelectListItem> ()
krilovich
Terima kasih 3,5 tahun kemudian!
tonyapolis
Terima kasih ini sangat membantu!
Kevin Coulson
Masih berlaku 5 tahun kemudian. Terima kasih!
Neill
23

Anda memerlukan tindakan yang sesuai dengan controller untuk tidak memiliki parameter.

Sepertinya untuk kombinasi pengontrol / tindakan yang Anda miliki:

public ActionResult Action(int parameter)
{

}

tapi kamu butuh

public ActionResult Action()
{

}

Juga, periksa Rute Debugger Phil Haack untuk memecahkan masalah rute.

Martin
sumber
6
Pengecualian terkait dengan Konstruktor, bukan metode tindakan.
Jason Wicker
4
@Logrythmik. Pengecualian yang dilaporkan adalah untuk konstruktor, tetapi masalahnya ada di metode tindakan. Saya memiliki metode kelas dan tindakan yang berfungsi, kemudian menambahkan parameter ke metode tindakan, dan mendapatkan kesalahan ini. Solusi alternatif adalah memberikan nilai untuk parameter. Atau buat parameter opsional - ini akan berfungsi ketika controller di C #, tetapi tidak bagi saya dengan F #
Stephen Hosking
Juga, jika Anda melakukan sesuatu seperti @ Html.Action ("SomeAction", new {myParameter = "42"}), pastikan bahwa nama parameter di panggilan Html.Action Anda cocok dengan nama parameter yang didefinisikan dalam metode tindakan Anda!
JT Taylor
20

Secara default, Pengendali MVC memerlukan konstruktor default tanpa parameter. Yang paling sederhana adalah membuat konstruktor default yang memanggil satu dengan parameter:

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

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

Namun, Anda dapat mengganti fungsi ini dengan menggulirkan fungsi Anda sendiri ControllerFactory. Dengan cara ini Anda bisa memberi tahu MVC bahwa ketika Anda membuat sebuah MyControllerberi contoh Helper.

Ini memungkinkan Anda untuk menggunakan kerangka kerja Ketergantungan Injeksi dengan MVC, dan benar-benar memisahkan segalanya. Contoh yang baik untuk ini adalah di situs web StructureMap . Seluruh quickstart baik, dan ia mendapatkan spesifik untuk MVC ke bagian bawah di "Pengkabelan Otomatis".

swilliams
sumber
6
Saya kira ini bukan jawaban yang tepat, @swilliams. Kuncinya di sini adalah bagian: didefinisikan untuk objek ini . Itu adalah pesan kesalahan omong kosong yang sebenarnya mengisyaratkan MODEL INPUT yang diteruskan tidak dapat dibuat. Jadi jika Anda memiliki model input yang tidak memiliki konstruktor tanpa parameter, maka Anda mendapatkan kesalahan ini. Sangat mudah untuk berpikir itu terkait dengan konstruktor CONTROLLER. Tapi ternyata tidak.
Pure.Krome
1
Ini adalah pesan omong kosong, yang akan membuat Anda mengejar angsa liar jika bukan karena respons seperti ini. Berkat jawaban ini dan respons di atas, saya bisa menyelesaikan masalah. Saya kira ini masalah tidak memahami sepenuhnya apa yang dilakukan pengikat di belakang layar. Saya pikir itu hanya akan mengatur masing-masing properti tetapi untuk beberapa alasan itu memanggil pengaturan get sebelum memposting juga. Jadi karena saya membebani konstruktor saya berlebihan dan harus mengkompensasi dengan konstruktor parameter yang lebih sedikit, saya harus menghitung nulls yang didapat sebagian dari properti saya, yang juga tidak terduga.
eaglei22
18

Kesalahan ini juga terjadi ketika menggunakan IDependencyResolver , seperti saat menggunakan wadah IoC , dan resolver dependensi mengembalikan nol. Dalam hal ini ASP.NET MVC 3 secara default menggunakan DefaultControllerActivator untuk membuat objek. Jika objek yang dibuat tidak memiliki konstruktor no-args publik, maka pengecualian akan dilemparkan setiap saat resolver dependensi yang disediakan telah kembali nol.

Berikut ini satu jejak tumpukan:

[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
Kaleb Pederson
sumber
2
Ini menyebabkan masalah saya: Penyelesai ketergantungan saya tidak dapat membuat pengontrol saya karena pengecualian. Itu ditelan oleh resolver, dikembalikan nol dan kerangka kerja MVC beralih ke aktivator pengendali default yang menghasilkan kesalahan yang dijelaskan.
Beriz
@ jmona789 Periksa apakah Anda telah mengatur semua dependensi yang disuntikkan di Global.asax Anda.
aloisdg pindah ke codidact.com
13

Anda bisa mendapatkan pengecualian ini di banyak tempat berbeda dalam kerangka kerja MVC (mis. Ia tidak bisa membuat controller, atau tidak bisa membuat model untuk memberikan controller itu).

Satu-satunya cara mudah yang saya temukan untuk mendiagnosis masalah ini adalah dengan mengganti MVC sedekat mungkin dengan kode Anda sendiri. Kemudian kode Anda akan masuk ke dalam Visual Studio ketika pengecualian ini terjadi, dan Anda bisa membaca tipe yang menyebabkan masalah dari tumpukan jejak.

Ini sepertinya cara yang mengerikan untuk mendekati masalah ini, tetapi sangat cepat, dan sangat konsisten.

Misalnya, jika kesalahan ini terjadi di dalam MVC DefaultModelBinder (yang akan Anda ketahui dengan memeriksa jejak stack), kemudian ganti DefaultModelBinder dengan kode ini:

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

Dan perbarui Global.asax.cs Anda:

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

Sekarang saat berikutnya Anda mendapatkan pengecualian itu, Visual Studio akan berhenti di dalam kelas MyDefaultModelBinder Anda, dan Anda dapat memeriksa properti "modelType" untuk melihat jenis apa yang menyebabkan masalah.

Contoh di atas berfungsi ketika Anda mendapatkan pengecualian "Tidak ada konstruktor tanpa parameter yang ditentukan untuk objek ini", hanya selama pengikatan model. Tetapi kode yang serupa dapat ditulis untuk titik ekstensi lain di MVC (misalnya konstruksi pengontrol).

Josh Mouch
sumber
Itulah yang saya pikirkan untuk lakukan untuk masalah saya.
Doug Chamberlain
Seandainya aku bisa lebih memilih ini. Menghemat lebih dari beberapa menit waktu saya.
Keith
8

Saya mendapat kesalahan yang sama, pelakunya dalam kasus saya adalah konstruktor yang tidak publik maupun pribadi .

Tidak ada konstruktor tanpa parameter yang ditentukan untuk objek ini.

Detail Pengecualian: System.MissingMethodException: Tidak ada konstruktor tanpa parameter yang ditentukan untuk objek ini.

Kode repro: Pastikan konstruktor memiliki publik sebelumnya.

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

    public string name
    {
        get;
        set;
    }
}
Hammad Khan
sumber
4
Sama seperti catatan, tidak memiliki pengubah akses pada konstruktor default ke "internal" di kompiler.
lsuarez
1
Menempatkan di sana pengubah "pribadi" tidak akan menyelesaikan masalah.
krzyski
7

Video pertama di http://tekpub.com/conferences/mvcconf

47:10 menit dalam menunjukkan kesalahan dan menunjukkan cara menimpa ControllerFactory default. Yaitu untuk membuat pabrik pengontrol peta struktur.

Pada dasarnya, Anda mungkin mencoba menerapkan injeksi ketergantungan ??

Masalahnya adalah ketergantungan antarmuka.

Dan B
sumber
Dan Anda bisa mendapatkan kelas StructureMapControllerFactory dari proyek MVC Storefront
Gautam Jain
6

Saya mendapat kesalahan yang sama ketika:

Menggunakan ModelView khusus, kedua Tindakan (GET dan POST) melewati ModelView yang berisi dua objek:

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

Dan POST juga menerima tampilan model yang sama:

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

Masalahnya adalah View menerima ModelView (diperlukan informasi produk dan daftar kategori), tetapi setelah dikirimkan hanya mengembalikan objek Produk, tetapi karena Tambah POST diharapkan ProductModelView melewati NULL tetapi konstruktor ProductModelView hanya membutuhkan dua parameter ( Product, RootCategories), kemudian mencoba mencari konstruktor lain tanpa parameter untuk case NULL ini kemudian gagal dengan "no parameterles ..."

Jadi, memperbaiki POST Add sebagai berikut, perbaiki masalah:

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

Semoga ini bisa membantu seseorang (saya menghabiskan hampir setengah hari untuk mencari tahu!).

Nestor
sumber
Nestor, ini mencerahkan dan tampaknya benar. Tapi mengapa View mengembalikan objek yang berbeda lalu menerima, yaitu objek Produk dan bukan ProductViewModel?
GilShalit
Oh, ini khusus untuk kasus saya, karena saya hanya perlu menyimpan data untuk Produk, RootCategories disahkan ke tampilan hanya untuk mencetak, tidak ada input yang dilakukan, jadi nilai-nilai mereka (RootCategories) tidak disimpan dalam <input > atau di tempat lain. Haruskah saya tetap menggunakan ViewModel yang sama, saya akan tetap menggunakan formulir <input>, data tampilan atau yang lainnya.
Nestor
GilShalit, hari ini saya menemukan jawaban (maaf saya lambat!), Melihat HTML yang diberikan saya melihat input mengambil nama [ObjectName]. [Properti], tetapi tidak ada jejak ViewModel asli, sehingga Anda hanya dapat mengambil masing-masing individu objek di dalam ViewModel, tetapi bukan ViewModel yang lengkap itu sendiri. Contoh :, jika ProductViewModel vm Anda memiliki objek di dalam Produk p dan Kategori c, maka GET controller Anda mengirimkan satu model vm ke View, maka Anda POST controller hanya dapat menerima parameter seperti (Produk p, Kategori c), tetapi bukan vm. .. jika saya salah akan menghargai umpan balik.
Nestor
5

Hal yang sama untukku. Masalah saya muncul karena saya lupa bahwa kelas model dasar saya sudah memiliki properti dengan nama yang didefinisikan dalam tampilan .

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

... dan model pemrosesan pengontrol:

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

Tidak ada yang istimewa, bukan? Tapi kemudian saya mendefinisikan tampilan ...

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

... yang menyebabkan kesalahan "Parameterless constructor" pada permintaan POST.

Semoga itu bisa membantu.

Anonim
sumber
5

Saya memiliki masalah yang sama, dan pada dasarnya intinya adalah bahwa ada beberapa argumen dalam metode tindakan yang tidak disediakan oleh proses Model Binding, (dan dengan kata lain bidang ini tidak diserahkan oleh halaman pengiriman).

Masalah ini akan muncul bahkan jika semua argumen kecuali satu disediakan, dan bahkan jika yang hilang adalah tipe nullable.

Masalahnya mungkin juga merupakan hasil dari salah ketik, di mana nama argumen dan nama bidang formulir tidak akan sama.

Solusinya adalah 1) memverifikasi bahwa nama cocok 2) memberikan nilai default untuk argumen 3) atau memberikan metode tindakan lain tanpa argumen ini.

halo yoel
sumber
Terima kasih @yo hal, jawaban Anda ternyata adalah salah satu yang memecahkan contoh khusus saya dari kesalahan ini. Pesan kesalahan yang diberikan kerangka kerja menjadi pesan kesalahan yang paling tidak berguna dalam hal ini.
Scott Lawrence
4

Saya memiliki masalah ini juga dan berpikir saya akan berbagi karena saya tidak dapat menemukan masalah saya di atas.

Ini adalah kode saya

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

Memanggil ActionResult ini:

public ActionResult Overview(int id)

Saya berasumsi akan cukup pintar untuk mengetahui bahwa nilai yang saya berikan adalah parameter id untuk Tinjauan, tetapi tidak. Ini memperbaikinya:

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

Brik
sumber
4

Saya mendapat pengecualian yang sama karena tidak ada konstruktor publik tanpa parameter

Kode seperti ini:

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

diubah menjadi

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

masalah terselesaikan bagi saya.

Muru Bakthavachalam
sumber
Saya mengalami masalah yang sama ketika menggunakan konstruktor yang dilindungi di kelas dasar - tampaknya solusi yang jelas sekarang!
keithl8041
4

Semua jawaban mengatakan untuk membuat parameter lebih sedikit konstruktor yang tidak ideal jika Anda tidak ingin pengembang lain menggunakannya dan hanya pengikat model.

Atribut di [Obsolete("For model binding only", true)]atas konstruktor publik akan menimbulkan kesalahan kompilator jika pengembang lain mencoba menggunakan ini. Butuh waktu lama bagi saya untuk menemukan ini, semoga membantu seseorang.

Martin Dawson
sumber
Sempurna - menambahkan atribut ini memungkinkan model MVC mengikat untuk bekerja saat runtime, dan mengatur parameter boolean atribut untuk benar-benar dicegah (pada waktu kompilasi) setiap upaya untuk instantiate konstruktor tanpa parameter. Jawaban terbaik di sini.
Greg Trevellick
3

Saya mendapat kesalahan ini. Saya menggunakan antarmuka di konstruktor saya dan resolver dependensi saya tidak dapat menyelesaikan, ketika saya mendaftar maka kesalahan hilang.

Ahmed
sumber
Jika Anda memiliki pertanyaan baru, silakan posting seperti itu. Ini seharusnya berupa komentar atau pertanyaan baru karena tidak berusaha menjawab masalah.
Nahuel Ianni
2

Saya memiliki masalah yang sama ...

Jika Anda menggunakan antarmuka untuk memisahkan koneksi Anda terhadap DbContext Anda (seperti saya), Anda dapat menggunakan structuremap.mvc (paket 3 atau 4 - nudget ) untuk dapat menggunakan konstruksi di kelas controller Anda. Ini akan memberi Anda folder DependencyResolution. Cukup ganti baris yang dikomentari dengan For <InterfaceClass> () dan Menggunakan <DbContextClass> ().

JeppePepp
sumber
2

Meskipun ini mungkin jelas bagi sebagian orang, penyebab kesalahan ini bagi saya adalah metode MVC saya mengikat pada model yang berisi properti tipe Tuple<>. Tuple<>tidak memiliki konstruktor tanpa parameter.

Tyler Forsythe
sumber
1

Saya memiliki masalah yang sama tetapi kemudian menemukan menambahkan antarmuka baru dan kelas yang sesuai mengharuskannya untuk terdaftar di Modul Initializable untuk injeksi ketergantungan. Dalam kasus saya, itu di dalam kode sebagai berikut:

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

}

arokanika
sumber
1

Dalam kasus saya, kelas saya memiliki [Serializable] atribut.

Anda diharuskan memiliki konstruktor yang tidak memiliki parameter jika kelas Anda [Serializable]

Ngarai Kolob
sumber
0

Kesalahan ini dimulai untuk saya ketika saya menambahkan cara baru untuk membuat instance kelas.

Contoh:

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

Kesalahan teratasi ketika saya menambahkan ketika saya melakukan perubahan ini, menambahkan konstruktor tanpa parameter. Saya percaya kompiler membuat konstuktor tanpa parameter secara default, tetapi jika Anda menambahkan sendiri maka Anda harus membuatnya secara eksplisit.

    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;
         }
     }
membuang
sumber
0

Saya telah menambahkan DropDownListke formulir saya, namun dalam kasus saya itu tidak (dan tidak dimaksudkan untuk) dikirimkan dengan formulir karena di luar <form></form>tag:

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

Karena Model hanya berisi bidang untuk tampilan, ini juga menyebabkan No parameterless constructor defined for this objectkesalahan karena bidang tidak dikirimkan sama sekali.

Dalam hal ini saya memperbaikinya dengan menambahkan pengecualian yang mengikat:

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

Ini terjadi pada saya, dan hasil pada halaman ini adalah sumber yang bagus yang membawa saya ke berbagai arah, tetapi saya ingin menambahkan kemungkinan lain:

Seperti yang dinyatakan dalam balasan lain, membuat konstruktor dengan parameter menghapus konstruktor tanpa parameter implisit, jadi Anda harus mengetiknya secara eksplisit.

Apa masalah saya adalah bahwa konstruktor dengan parameter default juga memicu pengecualian ini.

Memberikan kesalahan:

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

Bekerja:

public CustomerWrapper(CustomerDto customer){...}
public CustomerWrapper():this(null){}
Bendik August Nesbø
sumber
0

Kemungkinan besar Anda mungkin memiliki konstruktor parameter di pengontrol Anda dan pemecah ketergantungan apa pun yang Anda gunakan tidak dapat menyelesaikan ketergantungan dengan benar. Anda harus meletakkan break-point di mana metode penyelesaian ketergantungan ditulis dan Anda akan mendapatkan kesalahan yang tepat dalam pengecualian dalam.

Mahendra Savale
sumber
0

Saya memiliki masalah yang sama.

Baru Dihapus HttpFileCollectionBase filesdari argumen metode Pasca Tindakan dan ditambahkan seperti HttpFileCollectionBase files = Request.Files;di badan metode.

Muhammad Yasir
sumber
0

Saya menambahkan konstruktor tanpa parameter ke model di dalam Folder DOMAIN, dan masalahnya terpecahkan.

masukkan deskripsi gambar di sini

 public User()
        {

        }
Melodi
sumber
-3

Jadi saya mendapatkan pesan itu sebelumnya, ketika melakukan panggilan ajax. Jadi pada dasarnya yang diminta adalah konstruktor di kelas model yang dipanggil oleh contoller, tidak memiliki parameter apa pun.

Berikut ini sebuah contoh

public class MyClass{

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

 }
Carla
sumber
Saya menghapus konstruktor default dari model, ini berfungsi untuk saya.
Musakkhir Sayyed