ASP.NET MVC: Bu nesne için tanımlı parametresiz yapıcı yok


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

Steven Sanderson'ın ' Pro ASP.NET MVC Framework ' kitabını takip ediyordum . 132 Sayfasında, yazarın önerisi doğrultusunda ASP.NET MVC Vadeli İşlemler derlemesini karşıdan yükledim ve MVC projeme ekledi. [Not: Bu kırmızı bir ringa balığı olabilir.]

Bundan sonra projemi artık yükleyemedim. Yukarıdaki hata beni soğuk tuttu.

Sorum şu değil , "Kodumu düzeltmeme yardım eder misin?"

Bunun yerine, daha genel olarak bilmek istiyorum:

  • Bu sorunu nasıl gidermeliyim?
  • Ne aramalıyım?
  • Temel sebep ne olabilir?

Görünüşe göre yönlendirme ve denetleyicileri şimdi benden daha derin bir düzeyde anlamalıyım.

Yanıtlar:


226

Ben de benzer bir sorun yaşadım. A Modelparametresiz bir kurucu olmadığında da aynı istisna oluşur .

Çağrı yığını, bir modelin yeni bir örneğini oluşturmaktan sorumlu bir yöntem buluyordu.

System.Web.Mvc.DefaultModelBinder. CreateModel (ControllerContext controllerContext, ModelBindingContext bağlamaContext, Type modelType)


İşte bir örnek:

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

16
JSON verilerini eylemime POSTing yaparken benzer bir hata alıyordum. Bağlanmaya çalıştığı modelim parametresiz bir kurucuya sahip değil!
Tim

1
Not: Ben bir parametre tanımlayıcı değil, bir yapıcı tanımlamak eğer serileştirme sırasında bu sorun (parametresiz bla bla ... yok) var. Demek istediğim, bu örnekte, tanımladığınız yapıcıyı silerseniz (public MyModel (IHelper helper) {}) sorun kaybolur ... bu yüzden her yapıcı oluşturduğunuzda parametresiz bir tane oluşturmanız gerekir ... anlayabiliyorum şöyle: Bir kurucu tanımlamaya başladıktan sonra, sistem 'varsayılan nesneler' yaratma riskini almaz çünkü mantıklı olup olmadığını bilmez ... böyle bir şey.
H_He

1
Tuples ... belki buraya gelen bazı insanlar için: Sınıfınızda sadece Tuple'lar (Tuple <string, string> data; gibi) varsa, serileştirme tamam olacaktır (çünkü JSON serileştirme sırasında bu probla karşılaştım) ... ancak List <Tuple <string, string >> data gibi bir şey kullanırsanız; 'parametresiz yapıcı yok' hatasını almaya başlarsınız. .Net, Tuples oluşturamıyor / oluşturmuyor (bunun için referansım yok ancak Tuple <string, string> data = new Tuple <string, string> (); derlenmeyecek ... Tuple <string, string> data = new Tuple <string, string> ("", ""); tamam
H_He

3
Evet, ama bağımlılığı olan bir sınıfa parametresiz bir kurucu nasıl eklersiniz ve bunları kurucuya enjekte etmek mi istersiniz? Sorunun bu kısmı alamadım ...
EluciusFTW

2
@ToaoG bağımlılık enjeksiyon kütüphanesi size "enjeksiyon yapıcı" seçmek için bir yol sağlamalıdır. Btw, görünüm modellerinde bağımlılık enjeksiyonuna sahip olmak garip görünüyor.
SandRock

89

Bu, Modelinizde parametresiz bir kurucu olmadığından bir SelectList kullanıyorsa da oluşabilir :

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

Sebebi bu ise farklı bir şekilde yapmak için modelinizi yeniden düzenlemeniz gerekir. Bu nedenle, bir IEnumerable<Contact>özellik kullanarak ve farklı özellik tanımlarıyla açılır listeyi oluşturan bir uzantı yöntemi yazma:

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

Veya @Mark ve @krilovich yaklaşımını kullanabilirsiniz, SelectList'i IEnumerable olarak değiştirmeniz yeterlidir, MultiSelectList ile de çalışır.

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

1
Bu konuda çok fazla zaman harcadım ... ve bir SelectList döndüren yardımcı fonksiyonumu List <SelectListItem> döndürecek bir fonksiyona dönüştürmek zorunda kaldım .... blarg
Mark

IEnumerable <SelectListItem> 'i kullanabilir ve bunları yapıcısında yeni Liste <SelectListItem> ()
krilovich

3.5 yıl sonra teşekkürler!
tonyapolis

Teşekkür ederim bu son derece yararlı oldu!
Kevin Coulson

5 yıl sonra hala geçerli. Teşekkürler!
Neill

23

Bir parametrenin bulunmaması için denetleyiciye karşılık gelen eyleme ihtiyacınız vardır.

Sahip olduğunuz denetleyici / eylem kombinasyonuna benziyor:

public ActionResult Action(int parameter)
{

}

ama ihtiyacın var

public ActionResult Action()
{

}

Ayrıca, rota sorunlarını gidermek için Phil Haack'in Rota Hata Ayıklayıcısına göz atın .


6
İstisna, eylem yöntemiyle değil Yapıcı ile ilgilidir.
Jason Wicker

4
@Logrythmik. Bildirilen istisna yapıcı içindir, ancak sorun eylem yöntemindedir. Çalışmakta olan bir sınıf ve eylem yöntemi vardı, sonra eylem yöntemine bir parametre ekledim ve bu hatayı aldım. Alternatif bir çözüm, parametre için bir değer sağlamaktır. Veya parametreyi isteğe bağlı yapın - denetleyici C # olduğunda çalışmalıdır, ancak F # ile benim için olmadı
Stephen Hosking

Ayrıca, @ Html.Action ("SomeAction", yeni {myParameter = "42"}) gibi bir şey yapıyorsanız, Html.Action çağrınızdaki parametrenin adının, içinde tanımlanan parametrenin adıyla eşleştiğinden emin olun. eylem yönteminiz!
JT Taylor

20

Varsayılan olarak, MVC Denetleyicileri parametresiz varsayılan bir kurucu gerektirir. En basit olanı, parametrelerle birini çağıran varsayılan bir kurucu yapmak olacaktır:

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

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

Ancak, kendi işlevinizi yuvarlayarak bu işlevi geçersiz kılabilirsiniz ControllerFactory. Bu şekilde MVC'ye MyControllerbir örnek oluştururken buna bir örnek vereceğini söyleyebilirsiniz Helper.

Bu, Bağımlı Enjeksiyon çerçevelerini MVC ile kullanmanızı ve her şeyi gerçekten ayırmanızı sağlar. Bunun iyi bir örneği StructureMap web sitesinde bulunmaktadır . Bütün hızlı başlangıç ​​iyi ve o "Auto Wiring" de aşağı doğru MVC özgü alır.


6
Bunun doğru cevap olduğunu sanmıyorum, @swilliams. Buradaki anahtar, bu nesne için tanımlanan bölümdür . Bu aslında gelen GİRİŞ MODEL (leri) ima ipucu hata mesajı oluşturulamaz. Parametresiz yapıcısı olmayan bir girdi modeliniz varsa, bu hatayı alırsınız. CONTROLLER yapıcısı ile ilgili olduğunu düşünmek çok kolay. Ama değil.
Pure.Krome

1
Eğer böyle bir cevap için olmasaydı, vahşi bir kaz kovalamaca sahip olacak bir saçmalık mesajı. Bu cevap ve yukarıdaki cevap sayesinde, işleri halledebildim. Sanırım bu, cildin perde arkasında tam olarak ne yaptığını anlamama meselesi. Ben sadece her özelliği ayarlamak düşündüm ama nedense de gönderme sırasında ayarlamadan önce olsun çağırıyor. Bu yüzden benim kurucu aşırı ve parametre daha az yapıcı ile telafi etmek zorunda kaldım çünkü benim özelliklerinden biri alır nulls, aynı zamanda beklenmedik olduğunu hesaplamak zorunda kaldı.
eaglei22

18

Bu hata , bir IoC kapsayıcısı kullanılırken olduğu gibi bir IDependencyResolver kullanıldığında da oluşur ve bağımlılık çözücü null değerini döndürür. Bu durumda, ASP.NET MVC 3 varsayılan olarak nesneyi oluşturmak için DefaultControllerActivator'ı kullanır. Oluşturulan nesnenin ortak bir argüman yapıcısı yoksa, sağlanan bağımlılık çözümleyicisi null döndürdüğünde bir istisna atılır.

İşte böyle bir yığın izlemesi:

[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

2
Bu sorunuma neden oldu: Bağımlılık çözümleyicim, bir özel durum nedeniyle denetleyicimi oluşturamadı. Çözümleyici tarafından yutuldu, null döndürüldü ve MVC çerçevesi, varsayılan denetleyici aktivatörüne geçti ve açıklanan hatayla sonuçlandı.
Beriz

@ jmona789 Enjekte edilen tüm bağımlılıklarınızı Global.asax'ınızda ayarlayıp ayarlamadığınızı kontrol edin.
aloisdg taşınma codidact.com

13

Bu istisnayı MVC çerçevesindeki birçok farklı yerde alabilirsiniz (örneğin, denetleyiciyi oluşturamaz veya bu denetleyiciyi vermek için bir model oluşturamaz).

Bu sorunu teşhis etmenin tek kolay yolu, MVC'yi kendi kodunuzla olabildiğince istisnaya yakın bir şekilde geçersiz kılmaktır. Daha sonra kodunuz, bu özel durum oluştuğunda Visual Studio'nun içinde kırılır ve yığın izlemesinden soruna neden olan türü okuyabilirsiniz.

Bu, bu soruna yaklaşmanın korkunç bir yolu gibi görünüyor, ancak çok hızlı ve çok tutarlı.

Örneğin, bu hata MVC DefaultModelBinder içinde (yığın izlemesini kontrol ederek bileceksiniz) oluşuyorsa, DefaultModelBinder öğesini bu kodla değiştirin:

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

Ve Global.asax.cs dosyanızı güncelleyin:

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

Bir dahaki sefere bu özel durumu aldığınızda, Visual Studio MyDefaultModelBinder sınıfınızın içinde durur ve soruna hangi tür neden olduğunu görmek için "modelType" özelliğini denetleyebilirsiniz.

Yukarıdaki örnek, yalnızca model bağlama sırasında "Bu nesne için tanımlanmış parametresiz yapıcı yok" özel durumu elde ettiğinizde işe yarar. Ancak, MVC'deki diğer genişletme noktaları için benzer kod yazılabilir (örn. Denetleyici yapısı).


Sorunum için yapmayı düşündüğüm şey buydu.
Doug Chamberlain

Keşke daha fazlasını oylayabilseydim. Beni birkaç dakikamdan kurtardı.
Keith

8

Aynı hatayı aldım, benim durumumdaki suçlu , ne kamu ne de özel olan kurucuydu .

Bu nesne için parametresiz bir yapıcı tanımlanmadı.

Özel Durum Ayrıntıları: System.MissingMethodException: Bu nesne için parametresiz bir yapıcı tanımlı değil.

Repro kodu: Kurucudan önce herkese açık olduğundan emin olun.

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

    public string name
    {
        get;
        set;
    }
}

4
Bir not olarak, bir kurucuda erişim değiştiricilerinin bulunmaması derleyicide varsayılan olarak "internal" değerindedir.
lsuarez

1
orada "özel" değiştirici koymak sorunu çözmez.
krzyski

7

Http://tekpub.com/conferences/mvcconf adresindeki ilk video

47:10 dakika içinde hatayı gösterir ve varsayılan ControllerFactory'nin nasıl geçersiz kılınacağını gösterir. Yani yapı haritası denetleyicisi fabrikası oluşturmak.

Temel olarak, muhtemelen bağımlılık enjeksiyonu uygulamaya çalışıyorsunuz ??

Sorun şu ki arayüz bağımlılığı.


MVC Storefront projesinden StructureMapControllerFactory sınıfını alabilirsiniz
Gautam Jain

6

Aynı hatayı şu durumlarda aldım:

Özel bir ModelView kullanarak, her iki Eylem (GET ve POST) iki nesne içeren ModelView'i geçiriyordu:

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

POST aynı model görüşünü de kabul ediyor:

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

Sorun, Model'in (hem ürün hem de kategori listesi bilgileri gerekiyordu) Alınmasıydı, ancak gönderildikten sonra yalnızca Ürün nesnesini döndürüyordu, ancak POST Ekle bir ProductModelView beklediğinden NULL geçti ancak sonra ProductModelView yapıcısının iki parametreye ihtiyacı vardı ( Product, RootCategories), daha sonra bu NULL durumu için hiçbir parametresi olmayan başka bir kurucu bulmaya çalıştı ve sonra "parametre yok ..." ile başarısız oldu.

Bu nedenle, POST Add'i aşağıdaki gibi düzeltmek sorunu düzeltir:

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

Umarım bu birisine yardımcı olabilir (Bunu bulmak için neredeyse yarım gün geçirdim!).


Nestor, bu aydınlatıcı ve doğru görünüyor. Ancak Görünüm neden farklı bir nesneyi alıyorsa, yani ProductViewModel'i değil, bir Product nesnesini döndürüyor?
GilShalit

Oh, bu benim durumum için spesifikti, sadece Ürünler için veri tutmaya ihtiyacım olduğu için, RootCategoriler yalnızca çıktı almak için görünüme geçirildi, üzerinde hiçbir girdi yapılmadı, bu yüzden değerleri (RootCategories) <girişte tutulmadı > veya başka bir yerde. Aynı ViewModel tutmak gerekir mi Ben <input> formu, görünüm verileri veya başka bir şey kullanarak devam ediyorum.
Nestor

GilShalit, bugün bir cevap buldum (üzgünüm yavaşım!), HTML'ye baktığımda girdinin [ObjectName] adını aldığını gördüm. [Özellik], ancak orijinal ViewModel izi yok, bu yüzden sadece her bireyi alabilirsiniz ViewModel içinde değil, tam ViewModel içinde değil. Örnek:, ProductViewModel vm ürününüzde Ürün p ve Kategori c nesneleri varsa, GET denetleyiciniz Görünüm'e bir model vm gönderir, sonra POST denetleyiciniz yalnızca (Ürün p, Kategori c) gibi parametreleri kabul edebilir, ancak vm'yi kabul edemezsiniz. .. eğer yanılıyorsam, bazı geri bildirimleri takdir ediyorum.
Nestor

5

Bence de aynı. Benim temel model sınıfı zaten görünümde tanımlanmış adı ile özelliği olduğunu unuttum çünkü sorunum ortaya çıktı .

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

... ve kontrolör işleme modeli:

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

Özel bir şey yok, değil mi? Ama sonra görünümü tanımlıyorum ...

<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 isteğinde "Parametresiz yapıcı" hatasına neden oluyor.

Umarım yardımcı olur.


5

Benzer bir sorun yaşadım ve temel olarak, eylem yönteminde Model Bağlama işlemi tarafından sağlanmayan bazı argümanlar olduğu (ve diğer bir deyişle, bu alanların gönderen sayfa tarafından gönderilmediği).

Bu sorun, biri dışında tüm bağımsız değişkenler sağlansa ve eksik olanı boş değerli bir tür olsa bile ortaya çıkar.

Sorun, argüman adının ve form alanının adının aynı olmayacağı bir yazım hatası nedeniyle de olabilir.

Çözüm, 1) adların eşleştiğini doğrulamaktır 2) 3) argümanı için varsayılan bir değer sağlar veya bu argüman olmadan başka bir eylem yöntemi sağlar.


Teşekkürler @ hal, cevabın bu hatanın özel örneğini çözen yanıt olduğu ortaya çıktı. Çerçevenin tükettiği hata mesajı , bu durumda şimdiye kadarki en az kullanışlı hata mesajıdır .
Scott Lawrence

4

Ben de bu sorunu vardı ve yukarıdaki sorunum bulamıyorum çünkü paylaşacağımı düşündüm.

Bu benim kodumdu

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

Bu ActionResult'u çağırıyor:

public ActionResult Overview(int id)

Geçtiğim değerin Genel Bakış için kimlik parametresi olduğunu anlamaya yetecek kadar akıllı olacağını varsaydım, ama değil. Bu sorunu düzeltti:

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


4

Parametresiz bir kamu yapılandırıcısı olmadığı için aynı istisnayı yaşadım

Kod şöyleydi:

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

olarak değiştirildi

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

sorun çözüldü bana.


Bir temel sınıfta korumalı bir kurucu kullanırken aynı sorunu yaşıyordum - şimdi bariz bir çözüm gibi görünüyor!
keithl8041

4

Tüm cevaplar, daha az parametre oluşturucu oluşturduğunu söylüyor, bu da onu kullanan başka bir geliştirici ve sadece model bağlayıcıyı istemiyorsanız ideal değildir.

Genel bir kurucunun [Obsolete("For model binding only", true)]üzerindeki özellik , başka bir geliştirici bunu kullanmaya çalışırsa derleyici hatası atar. Bunu bulmak için yaşlarımı aldı, umarım birisine yardımcı olur.


Mükemmel - bu özniteliğin eklenmesi, MVC model bağlamanın çalışma zamanında çalışmasına izin verdi ve özniteliğin boolean parametresini true olarak ayarlamak, parametresiz yapıcıyı somutlaştırma girişimlerini engelledi (derleme zamanında). En iyi cevap burada.
Greg Trevellick

3

Bu hatayı aldım. Oluşturucumdaki arabirimleri kullanıyordum ve bağımlılık çözücüm çözemedi, i kaydettiğimde hata gitti.


Yeni bir sorunuz varsa, lütfen bu şekilde gönderin. Sorunu cevaplamaya çalışmadığından, bu bir yorum veya yeni bir soru olmalıdır.
Nahuel Ianni

2

Aynı sorunu yaşadım ...

Bağlantınızı DbContext'inize (benim gibi) ayırmak için bir arabirim kullanıyorsanız , denetleyici sınıfınızda bir yapı kullanabilmek için structuremap.mvc (3 veya 4 - nudget paketi ) kullanabilirsiniz. Bu size bir DependencyResolution klasörü verecektir. Yorum yaptığınız satırı For <InterfaceClass> () ve <DbContextClass> () ile değiştirin.


2

Bu bazıları için açık olsa da, benim için bu hatanın suçlu, MVC yöntemimin tür özellik içeren bir modele bağlanmasıydı Tuple<>. Tuple<>parametresiz bir kurucuya sahip değildir.


1

Ben aynı sorun vardı ama daha sonra herhangi bir yeni arayüz ekleyerek bulundu ve karşılık gelen sınıf bağımlılık enjeksiyon için Başlatılabilir Modül altında kayıtlı olmasını gerektirir. Benim durumumda aşağıdaki gibi kod içinde oldu:

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

}


1

Benim durumumda, sınıfımda [Serializable] niteliği .

Sınıfınız varsa parametre almayan bir kurucuya sahip olmanız gerekir [Serializable]


0

Bu hata, bir sınıfı başlatmak için yeni bir yol eklediğimde başladı.

Misal:

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

Parametresiz bir kurucu ekleyerek bu değişikliği yaptığımda eklediğimde hata çözüldü. Derleyici varsayılan olarak parametresiz bir yapı oluşturduğuna inanıyorum, ancak kendiniz eklerseniz, bunu açıkça oluşturmanız gerekir.

    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

Formuma bir ekledim DropDownList, ancak benim durumumda, <form></form>etiketlerin dışında olduğu gibi formla birlikte gönderilmedi (ve sunulması amaçlanmadı) :

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

Model yalnızca görüntüleme alanı içerdiğinden, alan No parameterless constructor defined for this objecthiç gönderilmediğinden bu da hataya neden oldu.

Bu durumda, bir hariç tutma bağlaması ekleyerek düzelttim:

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

0

Bu benim başıma geldi ve bu sayfadaki sonuçlar beni birçok yöne yönlendiren iyi bir kaynaktı, ancak başka bir olasılık eklemek istiyorum:

Diğer yanıtlarda belirtildiği gibi, parametrelerle bir kurucu oluşturmak örtük parametresiz kurucuyu kaldırır, bu yüzden açıkça yazmanız gerekir.

Benim sorunum, varsayılan parametreleri olan bir yapıcı da bu istisnayı tetikledi oldu.

Hata verir:

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

İşler:

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

0

Büyük olasılıkla denetleyicinizde parametreli kurucu olabilir ve kullandığınız bağımlılık çözücü ne olursa olsun bağımlılığı düzgün bir şekilde çözemez. Bağımlılık çözücü yönteminin yazıldığı yere bir kesme noktası koymanız gerekir ve iç istisnada kesin hatayı alırsınız.


0

Ben de aynı problemi yaşadım.

Sadece HttpFileCollectionBase filesEylem Sonrası yöntem bağımsız değişkeninden kaldırıldı ve HttpFileCollectionBase files = Request.Files;yöntem gövdesinde olduğu gibi eklendi .


0

DOMAIN Klasörü içindeki modele parametresiz bir kurucu ekledim ve sorun çözüldü.

resim açıklamasını buraya girin

 public User()
        {

        }

-3

Bir ajax çağrısı yaparken bu mesajı daha önce de aldım. Yani temel olarak istediği, bu model sınıfında, kontrolör tarafından çağrılan bir kurucunun herhangi bir parametresi yoktur.

İşte bir örnek

public class MyClass{

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

 }

Varsayılan kurucuyu modelden kaldırdım, bu benim için çalışıyor.
Musakkhir Sayyed
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.