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

ฉันติดตามหนังสือ ' Pro ASP.NET MVC FrameworkของSteven Sanderson บนหน้า 132 ตามคำแนะนำของผู้เขียนฉันดาวน์โหลดแอสเซมบลี ASP.NET MVC Futures และเพิ่มลงในโครงการ MVC ของฉัน [หมายเหตุ: นี่อาจเป็นปลาเฮอริ่งแดง]

หลังจากนี้ฉันไม่สามารถโหลดโครงการของฉันได้อีก ข้อผิดพลาดดังกล่าวหยุดฉันเย็น

คำถามของฉันไม่ใช่ "คุณสามารถช่วยฉันแก้ไขรหัสได้หรือไม่"

แต่ฉันต้องการทราบเพิ่มเติมโดยทั่วไป:

  • ฉันควรแก้ไขปัญหานี้อย่างไร
  • ฉันควรมองหาอะไร
  • สาเหตุที่แท้จริงอาจเป็นสาเหตุอะไร

ดูเหมือนว่าฉันควรเข้าใจการกำหนดเส้นทางและตัวควบคุมในระดับที่ลึกกว่าตอนนี้

คำตอบ:


226

ฉันเพิ่งมีปัญหาที่คล้ายกัน ข้อยกเว้นเดียวกันเกิดขึ้นเมื่อModelไม่มีคอนสตรัคเตอร์แบบไม่มีพารามิเตอร์

สแตกการเรียกได้รับการหาวิธีการที่รับผิดชอบในการสร้างอินสแตนซ์ใหม่ของรูปแบบ

System.Web.Mvc.DefaultModelBinder CreateModel (ControllerContext controllerContext, ModelBindingContext bindingContext, ประเภท 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
    {
    }
}

16
เมื่อโพสต์ข้อมูล JSON กับการกระทำของฉันฉันได้รับข้อผิดพลาดที่คล้ายกัน ปรากฎว่าแบบจำลองของฉันที่พยายามผูกไม่มีตัวสร้างแบบไม่มีพารามิเตอร์!
ทิม

1
หมายเหตุ: ฉันมีปัญหานี้เท่านั้น (ไม่มีพารามิเตอร์ bla bla ... ) ระหว่างการทำให้เป็นอนุกรมถ้าฉันกำหนดตัวสร้างและไม่ใช่ตัวสร้างแบบไร้พารามิเตอร์ ฉันหมายถึงในตัวอย่างนี้ถ้าคุณลบนวกรรมิกที่คุณกำหนด (public MyModel (ผู้ช่วย IHelper) {}) ปัญหาจะหายไป ... ดังนั้นทุกครั้งที่คุณสร้างนวกรรมิกคุณต้องสร้างพารามิเตอร์ที่ไม่ต้อง ... ฉันเข้าใจ เช่นนั้น: เมื่อคุณเริ่มกำหนดตัวสร้างระบบจะไม่เสี่ยงต่อการสร้าง 'วัตถุเริ่มต้น' เพราะมันไม่รู้ว่ามันสมเหตุสมผลหรือไม่ ...
H_He

1
Tuples ... อาจเป็นเพราะคนอื่น ๆ ที่มาที่นี่: ถ้าคุณมี Tuples (เช่น Tuple <string, string> data;) ในชั้นเรียนของคุณการทำให้เป็นอนุกรมจะไม่เป็นไร แต่ถ้าคุณใช้บางอย่างเช่น List <Tuple <string, string >> data; คุณจะเริ่มมีข้อผิดพลาด 'ไม่มีตัวสร้างแบบไร้พารามิเตอร์' เนื่องจาก. 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 ดูแปลก
SandRock

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 เพียงแค่ต้องแทนที่ SelectList เป็น IEnumerable ก็ใช้ได้กับ MultiSelectList ด้วย

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

1
ฉันเสียเวลาไปกับเรื่องนี้มาก ... และต้องเปลี่ยนฟังก์ชั่นตัวช่วยของฉันที่ส่งคืน SelectList กลับมาเป็นรายการที่จะส่งคืนรายการ <SelectListItem> .... blarg
Mark

คุณสามารถใช้ IEnumerable <SelectListItem> และสร้างอินสแตนซ์ใน Constructor ของคุณเป็น List ใหม่ <SelectListItem> ()
krilovich

ขอบคุณ 3.5 ปีต่อมา!
tonyapolis

ขอบคุณนี่เป็นประโยชน์อย่างมาก!
Kevin Coulson

ยังคงมีผลในอีก 5 ปีต่อมา ขอบคุณ!
Neill

23

คุณต้องการการกระทำที่สอดคล้องกับตัวควบคุมเพื่อไม่มีพารามิเตอร์

ดูเหมือนว่าชุดควบคุม / การกระทำที่คุณมี:

public ActionResult Action(int parameter)
{

}

แต่คุณต้องการ

public ActionResult Action()
{

}

ตรวจสอบเส้นทางดีบักเกอร์ของ Phil Haack เพื่อแก้ไขเส้นทาง


6
ข้อยกเว้นเกี่ยวข้องกับตัวสร้างไม่ใช่วิธีการดำเนินการ
Jason Wicker

4
@Logrythmik ข้อยกเว้นที่รายงานสำหรับตัวสร้าง แต่ปัญหาอยู่ในวิธีการดำเนินการ ฉันมีวิธีการเรียนและการกระทำที่ใช้งานได้จากนั้นเพิ่มพารามิเตอร์ให้กับวิธีการดำเนินการและได้รับข้อผิดพลาดนี้ โซลูชันทางเลือกคือการจัดเตรียมค่าสำหรับพารามิเตอร์ หรือทำให้ตัวเลือกพารามิเตอร์ - นี้ควรจะทำงานเมื่อตัวควบคุมใน C # แต่มันก็ไม่ได้สำหรับฉันกับ F #
สตีเฟ่นฮอส

นอกจากนี้หากคุณกำลังทำอะไรบางอย่างเช่น @ Html.Action ("SomeAction", ใหม่ {myParameter = "42"}) ตรวจสอบให้แน่ใจว่าชื่อของพารามิเตอร์ในการโทร Html.Action ตรงกับชื่อของพารามิเตอร์ที่กำหนดไว้ใน วิธีการกระทำของคุณ!
JT Taylor

20

โดยค่าเริ่มต้นตัวควบคุม MVC ต้องการตัวสร้างเริ่มต้นโดยไม่มีพารามิเตอร์ ที่ง่ายที่สุดคือการสร้างคอนสตรัคเตอร์เริ่มต้นที่เรียกพารามิเตอร์ที่มีพารามิเตอร์

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

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

ControllerFactoryอย่างไรก็ตามคุณสามารถแทนที่การทำงานนี้ด้วยการกลิ้งของคุณเอง วิธีนี้คุณสามารถบอก MVC ว่าเมื่อคุณกำลังสร้างให้ตัวอย่างของMyControllerHelper

สิ่งนี้ช่วยให้คุณสามารถใช้กรอบการฉีดพึ่งพากับ MVC และแยกแยะทุกอย่างได้ ตัวอย่างที่ดีของนี้มีมากกว่าที่เว็บไซต์ StructureMap การเริ่มต้นอย่างรวดเร็วนั้นดีและเขาก็เจาะจง MVC ไปที่ด้านล่างที่ "การเดินสายอัตโนมัติ"


6
ฉันไม่คิดว่านี่เป็นคำตอบที่ถูกต้อง @swilliams กุญแจนี่คือส่วน: กำหนดไว้สำหรับวัตถุนี้ นั่นเป็นข้อความแสดงข้อผิดพลาด crap ซึ่งจริง ๆ แล้วเป็นการบอกใบ้ที่ INPUT MODEL (s) ส่งผ่านเข้าไปไม่สามารถสร้างได้ ดังนั้นหากคุณมีรูปแบบการป้อนข้อมูลที่ไม่มีตัวสร้างแบบไม่มีพารามิเตอร์คุณจะได้รับข้อผิดพลาดนี้ ง่ายมากที่จะคิดว่ามันเกี่ยวข้องกับตัวควบคุม แต่มันไม่ใช่
Pure.Krome

1
มันเป็นข้อความอึที่จะให้คุณไล่ล่าห่านป่าถ้ามันไม่ได้สำหรับการตอบสนองเช่นนี้ ขอบคุณคำตอบนี้และคำตอบข้างต้นทำให้ฉันสามารถกำจัดสิ่งต่าง ๆ ออกไปได้ ฉันคิดว่ามันเป็นเรื่องที่ไม่เข้าใจอย่างเต็มที่ถึงสิ่งที่สารยึดเกาะกำลังทำอยู่เบื้องหลัง ฉันคิดว่ามันจะตั้งค่าแต่ละคุณสมบัติ แต่ด้วยเหตุผลบางอย่างมันเรียกการรับก่อนตั้งเมื่อโพสต์เช่นกัน ดังนั้นเพราะฉันโอเวอร์โหลดคอนสตรัคเตอร์ของฉันและต้องชดเชยด้วยพารามิเตอร์คอนสตรัคเตอร์น้อยลงฉันจึงต้องคิดค่า Null ซึ่งคุณสมบัติบางอย่างของฉันได้รับซึ่งก็ไม่คาดคิดเช่นกัน
eaglei22

18

ข้อผิดพลาดนี้ยังเกิดขึ้นเมื่อใช้IDependencyResolverเช่นเมื่อใช้คอนเทนเนอร์ IoC และตัวแก้ไขการพึ่งพาส่งคืน null ในกรณีนี้ 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
สิ่งนี้ทำให้เกิดปัญหาของฉัน: ตัวแก้ไขการพึ่งพาของฉันไม่สามารถสร้างตัวควบคุมได้เนื่องจากข้อยกเว้น มันถูกกลืนกินโดยตัวแก้ไขส่งคืนค่าว่างเปล่าและเฟรมเวิร์ก MVC สลับไปเป็นตัวควบคุมค่าเริ่มต้นซึ่งทำให้เกิดข้อผิดพลาด
Beriz

@ 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 ของคุณและคุณสามารถตรวจสอบคุณสมบัติ "modelType" เพื่อดูว่าเกิดปัญหาประเภทใด

ตัวอย่างข้างต้นใช้งานได้เมื่อคุณได้รับข้อยกเว้น "ไม่มีพารามิเตอร์ตัวสร้างที่กำหนดไว้สำหรับวัตถุนี้" ในระหว่างการรวมโมเดลเท่านั้น แต่สามารถเขียนโค้ดที่คล้ายกันสำหรับจุดส่วนขยายอื่น ๆ ใน MVC (เช่นการสร้างตัวควบคุม)


นั่นคือสิ่งที่ฉันคิดว่าจะทำเพื่อปัญหาของฉัน
Doug Chamberlain

หวังว่าฉันจะโหวตได้มากกว่านี้ ช่วยชีวิตฉันมากกว่าสองสามนาที
Keith

8

ผมได้รับข้อผิดพลาดเดียวกันผู้กระทำผิดในกรณีของฉันคือการสร้างซึ่งเป็นค่าที่สาธารณะหรือส่วนตัว

ไม่มีการกำหนดตัวสร้างแบบไม่มีพารามิเตอร์สำหรับวัตถุนี้

รายละเอียดของข้อยกเว้น: System.MissingMethodException: ไม่มีตัวสร้างแบบไม่มีพารามิเตอร์ที่กำหนดไว้สำหรับวัตถุนี้

รหัส Repro: ตรวจสอบให้แน่ใจว่าคอนสตรัคมีสาธารณะก่อน

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

    public string name
    {
        get;
        set;
    }
}

4
เช่นเดียวกับโน้ตการไม่มีตัวดัดแปลงการเข้าถึงบนตัวสร้างค่าเริ่มต้นเป็น "ภายใน" ในคอมไพเลอร์
lsuarez

1
การใส่ตัวดัดแปลง "ส่วนตัว" ไว้จะไม่ช่วยแก้ปัญหา
krzyski

7

วิดีโอแรกบนhttp://tekpub.com/conferences/mvcconf

47:10 นาทีในการแสดงข้อผิดพลาดและแสดงวิธีการแทนที่ ControllerFactory เริ่มต้น เช่นสร้างโรงงานควบคุมโครงสร้างแผนผัง

โดยทั่วไปคุณอาจพยายามใช้การฉีดพึ่งพา?

ปัญหาคือนั่นคือการพึ่งพาอินเตอร์เฟซ


และคุณสามารถรับคลาส StructureMapController คลาสโรงงานจากโครงการหน้าร้าน MVC
Gautam Jain

6

ฉันได้รับข้อผิดพลาดเดียวกันเมื่อ:

การใช้ ModelView แบบกำหนดเองทั้ง Actions (GET และ POST) จะผ่าน 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 (จำเป็นทั้งผลิตภัณฑ์และรายการของหมวดหมู่ข้อมูล) แต่หลังจากส่งถูกส่งกลับเฉพาะวัตถุผลิตภัณฑ์ แต่เป็น POST เพิ่มคาดว่า ProductModelView มันผ่าน NULL แต่แล้วตัวสร้าง ProductModelView เพียงต้องการสองพารามิเตอร์ ( ผลิตภัณฑ์ RootCategories) จากนั้นพยายามค้นหาตัวสร้างอื่นที่ไม่มีพารามิเตอร์สำหรับกรณี NULL นี้จากนั้นล้มเหลวด้วย "ไม่มีพารามิเตอร์ ... "

ดังนั้นการแก้ไข POST เพิ่มดังต่อไปนี้แก้ไขปัญหา:

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

หวังว่านี่จะช่วยใครซักคน (ฉันใช้เวลาเกือบครึ่งวันในการหาคำตอบนี้!)


Nestor นี่เป็นสิ่งที่ตรัสรู้และดูเหมือนถูกต้อง แต่ทำไม View จึงส่งคืนอ๊อพเจ็กต์ที่แตกต่างจากนั้นจะได้รับเช่น Product object และไม่ใช่ ProductViewModel?
GilShalit

โอ้นี่เป็นกรณีเฉพาะของฉันเนื่องจากฉันต้องการเก็บข้อมูลสำหรับผลิตภัณฑ์เท่านั้น RootCategories ถูกส่งผ่านไปยังมุมมองเพื่อพิมพ์เท่านั้นไม่มีการป้อนข้อมูลทำดังนั้นค่าของพวกเขา (RootCategories) จึงไม่ถูกเก็บไว้ใน <อินพุต > หรือที่อื่น ๆ ฉันจะต้องใช้ ViewModel แบบเดียวกันกับที่ฉันคงอยู่โดยใช้แบบฟอร์ม <input> ข้อมูลมุมมองหรืออย่างอื่น
Nestor

GilShalit วันนี้ฉันพบคำตอบ (ขออภัยฉันช้า!) ดู HTML ที่เรนเดอร์ฉันเห็นอินพุตใช้ชื่อ [ObjectName] [คุณสมบัติ] แต่ไม่มีร่องรอยของ ViewModel ดั้งเดิมดังนั้นคุณสามารถดึงแต่ละบุคคลได้เท่านั้น วัตถุภายใน ViewModel แต่ไม่ใช่ ViewModel ที่สมบูรณ์ ตัวอย่าง :, หาก ProductViewModel vm ของคุณมีวัตถุภายในผลิตภัณฑ์ p และหมวดหมู่ c ดังนั้นคอนโทรลเลอร์ GET ของคุณจะส่งโมเดล vm หนึ่งโมเดลไปยังมุมมองจากนั้นคอนโทรลเลอร์ POST ของคุณจะยอมรับเฉพาะพารามิเตอร์เช่น (ผลิตภัณฑ์ p, หมวดหมู่ c) แต่ไม่ใช่ vm .. ถ้าฉันผิดจะขอบคุณข้อเสนอแนะบางอย่าง
Nestor

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 hal คำตอบของคุณกลายเป็นคำตอบที่แก้ไขข้อผิดพลาดนี้โดยเฉพาะของฉัน ข้อความแสดงข้อผิดพลาดที่กรอบ spits out เกิดขึ้นเป็นข้อความแสดงข้อผิดพลาดที่มีประโยชน์น้อยที่สุดในกรณีนี้
Scott Lawrence

4

ฉันมีปัญหานี้เช่นกันและคิดว่าฉันจะแบ่งปันเนื่องจากไม่พบปัญหาของฉันด้านบน

นี่คือรหัสของฉัน

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

การเรียกใช้ ActionResult นี้:

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

ปัญหาได้รับการแก้ไขให้ฉัน


ฉันมีปัญหาเดียวกันเมื่อใช้ Constructor ที่ได้รับการป้องกันในคลาสฐาน - ดูเหมือนจะเป็นทางออกที่ชัดเจนในขณะนี้!
keithl8041

4

คำตอบทั้งหมดบอกว่าจะสร้างพารามิเตอร์ที่น้อยกว่าคอนสตรัคเตอร์ซึ่งไม่เหมาะถ้าคุณไม่ต้องการ devs อื่น ๆ ที่ใช้มันและมีเพียงตัวยึดโมเดลเท่านั้น

แอตทริบิวต์[Obsolete("For model binding only", true)]ด้านบนตัวสร้างสาธารณะจะโยนข้อผิดพลาดคอมไพเลอร์ถ้า dev อื่นพยายามใช้สิ่งนี้ เอาทุกวัยมาหาฉันหวังว่ามันจะช่วยใครซักคน


สมบูรณ์แบบ - การเพิ่มแอททริบิวต์นี้อนุญาตให้โมเดล MVC โยงทำงานที่รันไทม์และการตั้งค่าพารามิเตอร์บูลีนของแอททริบิวให้เป็นจริงที่ป้องกัน (ในเวลาคอมไพล์) ความพยายามใด ๆ คำตอบที่ดีที่สุดที่นี่
Greg Trevellick

3

ฉันได้รับข้อผิดพลาดนี้ ฉันใช้อินเทอร์เฟซในตัวสร้างและตัวแก้ไขการพึ่งพาของฉันไม่สามารถแก้ไขได้เมื่อฉันลงทะเบียนแล้วข้อผิดพลาดก็หายไป


หากคุณมีคำถามใหม่โปรดโพสต์เป็นเช่นนี้ สิ่งนี้ควรเป็นความคิดเห็นหรือคำถามใหม่เนื่องจากไม่ได้พยายามตอบปัญหา
Nahuel Ianni

2

ผมมีปัญหาเหมือนกัน...

หากคุณใช้อินเทอร์เฟซเพื่อแยกการเชื่อมต่อกับ DbContext ของคุณ (เช่นฉัน) คุณสามารถใช้โครงสร้าง map.mvc (แพ็คเกจ 3 หรือ 4 - nudget ) เพื่อใช้โครงสร้างในคลาสคอนโทรลเลอร์ของคุณ สิ่งนี้จะให้โฟลเดอร์ DependencyResolution กับคุณ เพียงแค่เปลี่ยนบรรทัดที่ใส่เครื่องหมายคอมเม้นต์ด้วยสำหรับ <InterfaceClass> () และเพื่อใช้ <DbContextClass> ()


2

ขณะนี้อาจจะชัดเจนกับบางผู้ร้ายของข้อผิดพลาดนี้สำหรับฉันก็คือวิธีการ MVC 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;
         }
     }

ข้อผิดพลาดได้รับการแก้ไขเมื่อฉันเพิ่มเมื่อฉันทำการเปลี่ยนแปลงนี้เพิ่มตัวสร้างแบบไร้พารามิเตอร์ ฉันเชื่อว่าคอมไพเลอร์สร้าง constuctor แบบไม่มีพารามิเตอร์ตามค่าเริ่มต้น แต่ถ้าคุณเพิ่มของคุณเองคุณต้องสร้างมันขึ้นมาอย่างชัดเจน

    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

ดังนั้นฉันจึงได้รับข้อความนั้นมาก่อนเช่นกันเมื่อทำการโทร ajax ดังนั้นสิ่งที่มันถามโดยทั่วไปก็คือคอนสตรัคเตอร์ในคลาสโมเดลนั้นซึ่งถูกเรียกโดยตัวควบคุม

นี่คือตัวอย่าง

public class MyClass{

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

 }

ฉันลบนวกรรมิกเริ่มต้นจากแบบจำลองซึ่งใช้งานได้สำหรับฉัน
Musakkhir Sayyed
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.