ASP.NET MVC: इस ऑब्जेक्ट के लिए कोई पैरामीटर रहित कंस्ट्रक्टर परिभाषित नहीं किया गया है


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

मैं स्टीवन सैंडरसन की ' प्रो ASP.NET MVC फ्रेमवर्क ' पुस्तक का अनुसरण कर रहा था । पृष्ठ 132 पर, लेखक की सिफारिश के अनुसार, मैंने ASP.NET MVC फ्यूचर्स असेंबली डाउनलोड की, और इसे अपने MVC प्रोजेक्ट में जोड़ा। [नोट: यह एक लाल हेरिंग हो सकता है।]

इसके बाद, मैं अब अपने प्रोजेक्ट को लोड नहीं कर सका। उपरोक्त त्रुटि ने मुझे ठंडा कर दिया।

मेरा सवाल यह नहीं है , "क्या आप मुझे अपना कोड ठीक करने में मदद कर सकते हैं?"

इसके बजाय, मैं अधिक सामान्य रूप से जानना चाहूंगा:

  • मुझे इस समस्या का निवारण कैसे करना चाहिए?
  • मुझे क्या खोजना चाहिए?
  • मूल कारण क्या हो सकता है?

ऐसा लगता है कि मुझे अब जितना करना है उससे अधिक गहरे स्तर पर रूटिंग और कंट्रोलर को समझना चाहिए।

जवाबों:


226

मुझे भी इसी तरह की समस्या थी। वही अपवाद तब होता है जब Modelकोई पैरामीटर रहित निर्माता नहीं होता है ।

एक मॉडल की नई आवृत्ति बनाने के लिए जिम्मेदार एक कॉल कॉल स्टैक लगा रहा था।

System.Web.Mvc.DefaultModelBinder। CreateModel (नियंत्रककोटेक्स्ट कंट्रोलर कोंटेक्स्ट, मॉडलबाइंडिंगटेक्स्ट बाइंडिंग कॉन्टेक्स्ट, टाइप मॉडल टाइप)


यहाँ एक नमूना है:

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 डेटा को मेरी कार्रवाई के लिए पोस्ट किया गया तो मुझे एक समान त्रुटि मिल रही थी। यह मेरा मॉडल निकलता है जिसे वह बांधने की कोशिश कर रहा है जिसमें एक पैरामीटर रहित निर्माण नहीं है!
टिम

1
नायब: मुझे केवल इस समस्या है (कोई पैरामीटर रहित bla bla ...) क्रमांकन के दौरान यदि मैं एक निर्माता को परिभाषित करता हूं, और एक पैरामीटर रहित अवरोधक नहीं। मेरा मतलब है, इस उदाहरण में, यदि आप अपने द्वारा परिभाषित किए गए कंस्ट्रक्टर (सार्वजनिक MyModel (IHelper सहायक) {}) को हटाते हैं, तो समस्या गायब हो जाती है ... इसलिए हर बार जब आप एक निर्माता बनाते हैं, तो आपको एक पैरामीटर रहित बनाना होगा ... मैं समझ सकता हूं जैसे: एक बार जब आप एक कंस्ट्रक्टर को परिभाषित करना शुरू करते हैं, तो सिस्टम 'डिफ़ॉल्ट ऑब्जेक्ट्स' बनाने के लिए जोखिम नहीं उठाता है क्योंकि यह नहीं जानता कि क्या यह समझ में आता है ... ऐसा कुछ।
एच_है

1
Tuples ... शायद कुछ अन्य लोगों के लिए जो यहां आते हैं: यदि आपके पास आपकी कक्षा में सिर्फ Tuples (जैसे Tuple <string, string> data;) है, तो क्रमबद्धता ठीक रहेगी (क्योंकि JSON क्रमांकन के दौरान मुझे इस संभावना का सामना करना पड़ा था) ... लेकिन अगर आप सूची <टुपल <स्ट्रिंग, स्ट्रिंग >> डेटा जैसी किसी चीज़ का उपयोग करते हैं; आपको 'कोई पैरामीटर रहित अवरोधक' त्रुटि नहीं शुरू होगी। क्योंकि .Net Tuples नहीं बना / बना सकता (मेरे पास इसके लिए कोई रेफरी नहीं है लेकिन Tuple <string, string> data = new Tuple <string, string> (); संकलन नहीं करेगा ... जबकि Tuple <string; string> data = new Tuple <string, string> ("", ""); ठीक है।
H_He

3
हाँ, लेकिन आप एक वर्ग के लिए एक पैरामीटर रहित निर्माता को कैसे जोड़ सकते हैं जिसमें निर्भरताएं हैं और आप उन्हें निर्माता में इंजेक्ट करना चाहते हैं? यह उस समस्या का हिस्सा है जो मुझे नहीं मिलता ...
EluciusFTW

2
@ToaoG आपकी निर्भरता इंजेक्शन लाइब्रेरी आपको "इंजेक्शन कंस्ट्रक्टर" का चयन करने का एक तरीका प्रदान करना चाहिए। Btw, viewmodels में निर्भरता इंजेक्शन अजीब लग रहा है।
सैंडरॉक

89

यह तब भी हो सकता है जब आपका मॉडल एक 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 दृष्टिकोण का उपयोग कर सकते हैं, बस चयनकर्ता को IEnumerable को बदलने की आवश्यकता है, यह मल्टीसेलेक्टिस्ट के साथ भी काम करता है।

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

1
मैंने इस पर इतना समय बर्बाद किया ... और अपने हेल्पर फंक्शन को चालू करना था, जो एक SelectList को एक में लौटा रहा था जो कि एक लिस्ट <SelectListItem> लौटाएगा .... blarg
Mark

आप IEnumerable <SelectListItem> का उपयोग कर सकते हैं और उन्हें अपने निर्माता में नई सूची के रूप में त्वरित कर सकते हैं <SelectListItem> ()
krilovich

3.5 साल बाद धन्यवाद!
tonyapolis

धन्यवाद यह बेहद मददगार था!
केविन कूलसन

5 साल बाद भी मान्य है। धन्यवाद!
नील

23

आपको पैरामीटर के नहीं होने के लिए नियंत्रक से मेल खाती क्रिया की आवश्यकता है

आपके लिए नियंत्रक / कार्रवाई संयोजन के लिए जैसा दिखता है:

public ActionResult Action(int parameter)
{

}

लेकिन आपको जरूरत है

public ActionResult Action()
{

}

इसके अलावा, मार्गों के निवारण के लिए फिल हैक के रूट डिबगर की जांच करें ।


6
अपवाद कंस्ट्रक्टर से संबंधित है, न कि एक्शन विधि से।
जेसन विकर

4
@Logrythmik। रिपोर्टेड अपवाद कंस्ट्रक्टर के लिए है, लेकिन समस्या एक्शन विधि में है। मेरे पास एक वर्ग और एक्शन विधि थी जो काम कर रही थी, फिर एक्शन विधि में एक पैरामीटर जोड़ा, और यह त्रुटि मिली। एक वैकल्पिक समाधान पैरामीटर के लिए एक मूल्य प्रदान करना है। या पैरामीटर को वैकल्पिक बनाएं - यह तब काम करना चाहिए जब नियंत्रक सी # में हो, लेकिन यह मेरे लिए एफ # के साथ नहीं था
स्टीफन होक्सिंग

इसके अलावा, यदि आप @ Html.Action ("SomeAction", नया {myParameter = "42"}) कुछ कर रहे हैं, तो सुनिश्चित करें कि आपके Html.Action कॉल में पैरामीटर का नाम परिभाषित पैरामीटर के नाम से मेल खाता है आपकी कार्रवाई विधि!
जेटी टेलर

20

डिफ़ॉल्ट रूप से, MVC नियंत्रकों को डिफ़ॉल्ट पैरामीटर की आवश्यकता होती है, जिसमें कोई पैरामीटर नहीं है। एक डिफॉल्ट कंस्ट्रक्टर बनाने के लिए सबसे सरल होगा जो पैरामीटर के साथ कॉल करता है:

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

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

हालाँकि, आप इस कार्यक्षमता को स्वयं रोल करके ओवरराइड कर सकते हैं ControllerFactory। इस तरह आप एमवीसी को बता सकते हैं कि जब आप MyControllerइसे एक उदाहरण बना रहे हैं Helper

यह आपको एमवीसी के साथ डिपेंडेंसी इंजेक्शन फ्रेमवर्क का उपयोग करने की अनुमति देता है, और वास्तव में सब कुछ कम कर देता है। इसका एक अच्छा उदाहरण स्ट्रक्च्योरपाइप वेबसाइट पर है । पूरा क्विकस्टार्ट अच्छा है, और वह "ऑटो वायरिंग" में नीचे की ओर एमवीसी के लिए विशिष्ट हो जाता है।


6
मुझे नहीं लगता कि यह सही उत्तर है, @swilliams। यहाँ कुंजी इस भाग है: इस वस्तु के लिए परिभाषित । यह एक बकवास त्रुटि संदेश है जो वास्तव में INPUT MODEL (s) पर संकेत कर रहा है जिसे बनाया नहीं जा सकता है। इसलिए यदि आपके पास एक इनपुट मॉडल है जिसमें कोई पैरामीटर रहित कंस्ट्रक्टर नहीं है, तो आपको यह त्रुटि मिलती है। यह सोचना बहुत आसान है कि यह कंट्रोलर कंस्ट्रक्टर से संबंधित था। लेकिन ऐसा नहीं है।
शुद्ध। क्रोम

1
यह एक भद्दा संदेश है, यदि आपके पास एक जंगली हंस का पीछा होगा अगर यह इन जैसी प्रतिक्रियाओं के लिए नहीं था। इस जवाब और उपरोक्त प्रतिक्रिया के लिए धन्यवाद, मैं चीजों को दूर करने में सक्षम था। मुझे लगता है कि यह पूरी तरह से समझने की बात नहीं है कि बिंदर पर्दे के पीछे क्या कर रहा है। मुझे लगा कि यह बस प्रत्येक संपत्ति सेट करेगा, लेकिन किसी कारण से जब यह पोस्ट करने से पहले सेटिंग प्राप्त कर रहा है। इसलिए क्योंकि मैंने अपने कंस्ट्रक्टर को ओवरलोड कर दिया था और मुझे एक पैरामीटर कम कंस्ट्रक्टर के साथ क्षतिपूर्ति करनी थी, मुझे अपनी कुछ संपत्ति प्राप्त करने के लिए नलस के लिए जिम्मेदार होना था, जो अप्रत्याशित भी था।
eaglei22

18

यह त्रुटि भी तब होती है जब एक ID निर्भरताResolver का उपयोग कर , जैसे कि कंटेनर का उपयोग करते समय, और निर्भरता रिज़ॉल्वर की वापसी । इस स्थिति में ASP.NET MVC 3 ऑब्जेक्ट बनाने के लिए DefaultControllerActivator का उपयोग करने के लिए चूक करता है। यदि बनाई जा रही वस्तु में सार्वजनिक नहीं-आर्ग कंस्ट्रक्टर अपवाद नहीं है, तो किसी भी समय फेंक दिया जाएगा, बशर्ते निर्भरता रिवाल्वर वापस आ गई है।

यहाँ एक ऐसा स्टैक ट्रेस है:

[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
इसने मेरे मुद्दे को जन्म दिया: मेरी निर्भरता रिज़ॉल्वर अपवाद के कारण मेरे नियंत्रक का निर्माण करने में असमर्थ थी। यह रिज़ॉल्वर द्वारा निगल लिया गया था, अशक्त हो गया और एमवीसी फ्रेमवर्क डिफ़ॉल्ट नियंत्रक एक्टिविटर पर स्विच हो गया जिसके परिणामस्वरूप त्रुटि हुई।
बेरिज

@ jmona789 जाँच करें कि क्या आपने अपने सभी इंजेक्टेड निर्भरताएँ अपने Global.asax में सेट की हैं।
aloisdg codidact.com

13

आप MVC फ्रेमवर्क में कई अलग-अलग स्थानों पर यह अपवाद प्राप्त कर सकते हैं (जैसे कि यह नियंत्रक नहीं बना सकता है, या यह उस नियंत्रक को देने के लिए मॉडल नहीं बना सकता है)।

इस समस्या का निदान करने का एकमात्र आसान तरीका यह है कि आप अपने कोड के साथ MVC को अपवाद के करीब ले जाएं। तब यह अपवाद होने पर आपका कोड Visual Studio के अंदर टूट जाएगा, और आप स्टैक ट्रेस से समस्या पैदा करने वाले प्रकार को पढ़ सकते हैं।

यह इस समस्या से निपटने के लिए एक भयानक तरीका लगता है, लेकिन यह बहुत तेज़ है, और बहुत सुसंगत है।

उदाहरण के लिए, यदि यह त्रुटि 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 वर्ग के अंदर बंद हो जाएगा, और आप "मॉडल टाइप" संपत्ति की जांच कर सकते हैं कि किस प्रकार की समस्या का कारण है।

उपरोक्त उदाहरण तब काम करता है जब आपको केवल मॉडल बाइंडिंग के दौरान "इस ऑब्जेक्ट के लिए कोई पैरामीटर नहीं परिभाषित करता है" अपवाद मिलता है। लेकिन एमवीसी (जैसे नियंत्रक निर्माण) में अन्य विस्तार बिंदुओं के लिए समान कोड लिखा जा सकता है।


यही मैं अपनी समस्या के लिए करने की सोच रहा था।
डग चेम्बरलेन

काश मैं इसे और बढ़ा पाता। मुझे अपने समय के कुछ मिनटों से अधिक बचाया।
कीथ

8

मुझे वही त्रुटि मिली, मेरे मामले में अपराधी कंस्ट्रक्टर था जो न तो सार्वजनिक था और न ही निजी था

इस ऑब्जेक्ट के लिए कोई भी पैरामीटर रहित कंस्ट्रक्टर परिभाषित नहीं किया गया है।

अपवाद विवरण: System.MissingMethodException: इस ऑब्जेक्ट के लिए कोई भी पैरामीटर रहित पैरामीटर निर्धारित नहीं किया गया है।

रेप्रो कोड: सुनिश्चित करें कि इसके पहले कंस्ट्रक्टर सार्वजनिक है।

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

    public string name
    {
        get;
        set;
    }
}

4
बस एक नोट के रूप में, कंपाइलर में "आंतरिक" के लिए एक डिफाल्टर डिफ़ॉल्ट पर एक्सेस मॉडिफायर की कमी है।
larearez

1
वहाँ "निजी" संशोधक डालने से समस्या हल नहीं होगी।
krzyski

7

पहले वीडियो पर Http://tekpub.com/conferences/mvcconf

47:10 मिनट त्रुटि दिखाने के लिए और दिखाता है कि डिफ़ॉल्ट नियंत्रक को ओवरराइड कैसे किया जाए। यानी संरचना मानचित्र नियंत्रक कारखाना बनाने के लिए।

मूल रूप से, आप शायद निर्भरता इंजेक्शन को लागू करने की कोशिश कर रहे हैं ??

समस्या यह है कि इंटरफ़ेस निर्भरता है।


और आप MVC स्टोरफ्रंट प्रोजेक्ट से स्ट्रक्चोरपॉइंटकंट्रोलरफैक्टरी क्लास प्राप्त कर सकते हैं
गौतम जैन

6

मुझे वही त्रुटि मिली जब:

एक कस्टम मॉडल व्यू का उपयोग करते हुए, दोनों क्रियाएँ (GET और POST) मॉडलव्यू को पारित कर रहे थे जिसमें दो ऑब्जेक्ट शामिल थे:

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

और POST भी उसी मॉडल दृश्य को स्वीकार कर रहा है:

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

समस्या यह थी कि मॉडलव्यू प्राप्त हुआ था (उत्पाद और श्रेणियों की सूची की जानकारी दोनों की जरूरत थी), लेकिन प्रस्तुत करने के बाद केवल उत्पाद वस्तु वापस आ रही थी, लेकिन जैसा कि पोस्ट एड ने उम्मीद की थी कि एक ProductModelView यह एक NULL से गुजर गया लेकिन फिर ProductModelView केवल दो मापदंडों के लिए दो मापदंडों की आवश्यकता है ( उत्पाद, RootCategories), फिर इस NULL मामले के लिए कोई पैरामीटर नहीं के साथ एक और कंस्ट्रक्टर को खोजने की कोशिश की, फिर "नोजल" ​​के साथ विफल ...

इसलिए, POST Add को ठीक करने से समस्या ठीक हो जाती है:

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

आशा है कि यह किसी की मदद कर सकता है (यह पता लगाने के लिए मैंने लगभग आधा दिन बिताया है!)।


नेस्टर, यह ज्ञानवर्धक है और सही लगता है। लेकिन क्यों दृश्य एक अलग वस्तु को लौटा रहा है, तो वह प्राप्त कर रहा है, अर्थात एक उत्पाद वस्तु और नहीं ProductViewModel?
गिलशिलिट

ओह, यह मेरे मामले के लिए विशिष्ट था, क्योंकि मुझे केवल उत्पादों के लिए डेटा रखने की आवश्यकता है, रूटकैर्टरीज को केवल प्रिंट आउट करने के लिए पास किया गया था, इस पर कोई इनपुट नहीं किया गया था, इसलिए उनके मान (RootCategories) को इनपुट में नहीं रखा गया था > या कहीं और। क्या मुझे वही व्यूमॉडल रखने की आवश्यकता होगी जो मैं फॉर्म <इनपुट>, व्यू डेटा या कुछ और का उपयोग करके जारी रखूंगा।
नेस्टर

GilShalit, आज मुझे एक उत्तर मिला (माफ करना Im slow!), HTML रेंडर को देखते हुए मैंने देखा कि इनपुट [ObjectName] का नाम लेता है। [संपत्ति], लेकिन मूल ViewModel का कोई निशान नहीं है, इसलिए आप केवल प्रत्येक व्यक्ति को पुनः प्राप्त कर सकते हैं। ViewModel के अंदर ऑब्जेक्ट, लेकिन पूरा ViewModel ही नहीं। उदाहरण:, यदि आपके ProductViewModel vm के अंदर ऑब्जेक्ट्स p और श्रेणी c हैं, तो आपका GET कंट्रोलर एक मॉडल vm को व्यू में भेजता है, तो आप POST कंट्रोलर केवल मापदंडों को स्वीकार कर सकते हैं जैसे (प्रोडक्ट p, कैटेगरी c), लेकिन vm नहीं। .. अगर मैं गलत हूं तो कुछ प्रतिक्रिया की सराहना करूंगा।
नेस्टर

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 अनुरोध पर "पैरामीटरलेस कंस्ट्रक्टर" त्रुटि का कारण बनता है।

उम्मीद है की वो मदद करदे।


5

मुझे एक समान समस्या थी, और मूल रूप से मुद्दा यह है कि एक्शन विधि में कुछ तर्क हैं जो मॉडल बाइंडिंग प्रक्रिया द्वारा आपूर्ति नहीं की गई थी, और (दूसरे शब्दों में इन क्षेत्रों को प्रस्तुत पृष्ठ द्वारा प्रस्तुत नहीं किया गया था)।

यह समस्या तब भी आएगी जब सभी तर्क दिए जाएंगे, लेकिन एक की आपूर्ति की जाएगी, और यहां तक ​​कि अगर एक लापता है तो एक अशक्त प्रकार है।

समस्या एक टाइपो का परिणाम भी हो सकती है, जिसमें तर्क का नाम और फॉर्म फ़ील्ड का नाम समान नहीं होगा।

समाधान 1 है) यह सत्यापित करें कि नाम 2 से मेल खाते हैं) तर्क 3 के लिए डिफ़ॉल्ट मान प्रदान करते हैं) या इस तर्क के बिना कोई अन्य कार्य विधि प्रदान करें।


धन्यवाद @yo हाल, आपका उत्तर वही निकला जो इस त्रुटि के मेरे विशेष उदाहरण को हल करता है। त्रुटि संदेश फ्रेमवर्क स्पिट आउट इस उदाहरण में कभी भी सबसे कम उपयोगी त्रुटि संदेश होता है ।
स्कॉट लॉरेंस

4

मुझे भी यह समस्या थी और मैंने सोचा था कि मैं अपनी समस्या का पता नहीं लगा पाऊंगा।

यह मेरा कोड था

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

इस क्रिया को कॉल करना

public ActionResult Overview(int id)

मुझे लगता है कि यह समझ लेना काफी स्मार्ट होगा कि मैं जो मान पास करता हूं वह अवलोकन के लिए आईडी पैरामटर है, लेकिन यह नहीं है। यह तय है:

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


4

मुझे कोई अपवाद नहीं मिला क्योंकि कोई पैरामीटरहीन सार्वजनिक अवरोधक नहीं था

कोड इस तरह था:

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

में परिवर्तित किया गया

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

मेरे लिए समस्या का समाधान।


बेस क्लास में संरक्षित कंस्ट्रक्टर का उपयोग करते समय मुझे एक ही समस्या थी - अब एक स्पष्ट समाधान लगता है!
कीथल8041

4

सभी उत्तर कहते हैं कि एक पैरामीटर कम निर्माणकर्ता बनाने के लिए जो आदर्श नहीं है यदि आप किसी अन्य देवता का उपयोग नहीं करना चाहते हैं और केवल मॉडल बांधने की मशीन है।

[Obsolete("For model binding only", true)]यदि कोई अन्य देव इसका उपयोग करने का प्रयास करता है, तो सार्वजनिक निर्माणकर्ता के ऊपर की विशेषता एक संकलक त्रुटि को फेंक देगी। मुझे इसे खोजने के लिए उम्र लग गई, आशा है कि यह किसी की मदद करता है।


बिल्कुल सही - इस विशेषता को जोड़ने से एमवीसी मॉडल को रनटाइम पर काम करने की अनुमति मिलती है, और विशेषता के बूलियन पैरामीटर को सही समय पर (संकलित समय पर) पैरामीटर रहित कंस्ट्रक्टर को तुरंत करने का प्रयास करने की अनुमति मिलती है। सबसे अच्छा जवाब यहाँ।
ग्रेग ट्रेवेलिक

3

मुझे यह त्रुटि मिली। मैं अपने कंस्ट्रक्टर में इंटरफेस का उपयोग कर रहा था और मेरी निर्भरता रिज़ॉल्वर हल करने में सक्षम नहीं थी, जब मैंने इसे पंजीकृत किया तब त्रुटि चली गई।


यदि आपके पास कोई नया प्रश्न है, तो कृपया इसे इस तरह पोस्ट करें। यह या तो एक टिप्पणी या एक नया प्रश्न होना चाहिए था क्योंकि यह समस्या का उत्तर देने का प्रयास नहीं करता है।
नहुएल इयानी

2

मुझे भी यही समस्या थी...

अपने एक इंटरफ़ेस का उपयोग कर रहा है (मेरे जैसे) अपने DbContext के खिलाफ अपने कनेक्शन दसगुणा आप उपयोग कर सकते structuremap.mvc (3 या 4 - nudget पैकेज ) अपने नियंत्रक कक्षा में एक constructure उपयोग करने के लिए सक्षम होने के लिए। यह आपको DependencyResolution फ़ोल्डर देगा। बस अपने इंटरफ़ेस <के लिए <इंटरफ़ेसक्लास> () और <DbContextClass> () का उपयोग करें।


2

हालांकि यह कुछ के लिए स्पष्ट हो सकता है, मेरे लिए इस त्रुटि का अपराधी मेरी एमवीसी विधि एक मॉडल के लिए बाध्य थी जिसमें प्रकार की संपत्ति थी Tuple<>Tuple<>कोई पैरामीटर रहित निर्माता नहीं है।


1

मुझे भी यही समस्या थी लेकिन बाद में कोई भी नया इंटरफ़ेस मिला और इसी वर्ग को निर्भरता इंजेक्शन के लिए प्रारंभिक मॉड्यूल के तहत पंजीकृत होना आवश्यक था। मेरे मामले में यह इस प्रकार कोड के अंदर था:

[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

मेरे मामले में, मेरी कक्षा में [Serializable]विशेषता थी।

आपको एक ऐसे रचनाकार की आवश्यकता होती है जो आपकी श्रेणी के होने पर कोई पैरामीटर न ले [Serializable]


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

0

मैंने 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

यह मेरे साथ हुआ, और इस पृष्ठ पर परिणाम एक अच्छा संसाधन था जिसने मुझे कई दिशाओं में ले जाया, लेकिन मैं एक और संभावना जोड़ना चाहूंगा:

जैसा कि अन्य उत्तरों में कहा गया है, मापदंडों के साथ एक निर्माणकर्ता निहित पैरामीटर रहित निर्माणकर्ता को हटा देता है, इसलिए आपको इसे स्पष्ट रूप से लिखना होगा।

मेरी समस्या यह थी कि डिफ़ॉल्ट मापदंडों वाले एक निर्माता ने भी इस अपवाद को शुरू किया।

त्रुटियां देता है:

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

काम करता है:

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

0

अधिकांश शायद आपने अपने नियंत्रक में निर्माणकर्ता को पैरामीटर किया होगा और जो भी निर्भरता रिज़ॉल्वर आप उपयोग कर रहे हैं वह निर्भरता को ठीक से हल करने में सक्षम नहीं है। आपको ब्रेक-पॉइंट लगाने की आवश्यकता है जहां निर्भरता रिज़ॉल्वर विधि लिखी गई है और आपको आंतरिक अपवाद में सटीक त्रुटि मिलेगी।


0

मुझे भी यही समस्या थी।

बस HttpFileCollectionBase filesपोस्ट एक्शन विधि तर्क से हटा दिया गया और HttpFileCollectionBase files = Request.Files;विधि निकाय की तरह जोड़ दिया गया ।


0

मैंने DOMAIN फ़ोल्डर के अंदर मॉडल में एक पैरामीटर रहित कंस्ट्रक्टर जोड़ा, और समस्या हल हो गई।

यहां छवि विवरण दर्ज करें

 public User()
        {

        }

-3

इसलिए मैंने उस संदेश को पहले भी प्राप्त कर लिया है, जब अजाक्स कॉल कर रहा था। तो यह जो मूल रूप से पूछ रहा है, उस मॉडल वर्ग में एक कंस्ट्रक्टर है जिसे कॉनोलर द्वारा बुलाया जा रहा है, कोई पैरामीटर नहीं है।

यहाँ एक उदाहरण है

public class MyClass{

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

 }

मैंने मॉडल से डिफ़ॉल्ट कंस्ट्रक्टर को हटा दिया, यह मेरे लिए काम करता है।
मुसाखिर सैय्यद
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.