2008-12-01 46 views
13

Các callstack cho thấy như sau:Lỗi máy chủ trong ứng dụng '/'. Không xây dựng parameterless định nghĩa cho đối tượng này

[MissingMethodException: No parameterless constructor defined for this object.] 
System.RuntimeTypeHandle.CreateInstance(RuntimeType type, Boolean publicOnly, Boolean noCheck, Boolean& canBeCached, RuntimeMethodHandle& ctor, Boolean& bNeedSecurityCheck) +0 
System.RuntimeType.CreateInstanceSlow(Boolean publicOnly, Boolean fillCache) +86 
System.RuntimeType.CreateInstanceImpl(Boolean publicOnly, Boolean skipVisibilityChecks, Boolean fillCache) +230 
System.Activator.CreateInstance(Type type, Boolean nonPublic) +67 
System.Activator.CreateInstance(Type type) +6 
System.Web.Mvc.DefaultModelBinder.CreateModel(ModelBindingContext bindingContext, Type modelType) +277 
System.Web.Mvc.<>c__DisplayClass1.<BindModel>b__0() +98 
System.Web.Mvc.ModelBindingContext.get_Model() +51 
System.Web.Mvc.DefaultModelBinder.BindModelCore(ModelBindingContext bindingContext) +2600 
System.Web.Mvc.DefaultModelBinder.BindModel(ModelBindingContext bindingContext) +1067 
System.Web.Mvc.DefaultModelBinder.BindProperty(ModelBindingContext parentContext, Type propertyType, Func`1 propertyValueProvider, String propertyName) +208 
System.Web.Mvc.DefaultModelBinder.BindModelCore(ModelBindingContext bindingContext) +1787 
System.Web.Mvc.DefaultModelBinder.BindModel(ModelBindingContext bindingContext) +1067 
System.Web.Mvc.ControllerActionInvoker.GetParameterValue(ParameterInfo parameterInfo) +355 
System.Web.Mvc.ControllerActionInvoker.GetParameterValues(MethodInfo methodInfo) +439 
System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext, String actionName) +288 
System.Web.Mvc.Controller.ExecuteCore() +180 
System.Web.Mvc.ControllerBase.Execute(RequestContext requestContext) +96 
System.Web.Mvc.ControllerBase.System.Web.Mvc.IController.Execute(RequestContext requestContext) +36 
System.Web.Mvc.MvcHandler.ProcessRequest(HttpContextBase httpContext) +377 
System.Web.Mvc.MvcHandler.ProcessRequest(HttpContext httpContext) +71 
System.Web.Mvc.MvcHandler.System.Web.IHttpHandler.ProcessRequest(HttpContext httpContext) +36 
System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +181 
System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +75 

Tôi có một hình thức nhỏ với một loạt các lĩnh vực tiềm ẩn và một nút gửi. Khi tôi nhấn nó, tôi thậm chí không bao giờ nhấn phương pháp được yêu cầu.

Làm cách nào để tiếp tục và gỡ lỗi điều này? Nó sẽ là một khởi đầu tuyệt vời nếu tôi biết đối tượng WHAT không có một hàm tạo parameterless. Đối tượng này ở đâu? Làm sao tôi có thể giải quyết việc này? Tôi biết câu hỏi là khá mơ hồ, nhưng hiện tại nó là tất cả tôi đã có ..

--EDIT--
Ở dạng của tôi, tôi thêm Html.Hidden) đầu vào (. Tùy thuộc vào các hành động trước đó, chúng có thể có giá trị "". Hành động này sử dụng ModelBinding. Bất cứ khi nào giá trị là "" và datatype là một SelectList, modelbinder đi berzerk trên tôi.

Tôi cảm thấy ngày càng khó chịu với cách SelectList đang làm điều đó ... Ý tưởng là tốt, nhưng có một số vấn đề với nó.

+0

Chữ ký của hành động bạn đang cố gắng gọi là gì? –

+0

Bạn có thêm tham số vào hàm tạo của bộ điều khiển của bạn hoặc loại bỏ hàm tạo mặc định trên bộ điều khiển của bạn không? –

+0

Todd, đó không phải là vấn đề. Nhìn vào ngăn xếp; bộ điều khiển đã được tạo. Đó là mô hình, có lẽ là một trong những args cho hành động. –

Trả lời

7

Tôi đã giải quyết vấn đề gây ra bởi đối tượng SelectList vì nó không cung cấp hàm tạo mặc định vì vậy chúng tôi không thể có trong ViewModel.

+0

Ic, cảm ơn phản hồi :) –

1

Bạn có xóa Default.aspx không? Điều đó cần phải được thực hiện để hiển thị đúng root. Điều này cũng có thể xảy ra nếu bạn đang cố gắng sử dụng Dependency Injection và vùng chứa của bạn không được thiết lập đúng cách - nghĩa là không có ControllerFactory yêu cầu DI Container cho cá thể đó.

+0

Không, nó ở đó. Tôi tìm ra nguyên nhân là gì, nhưng không phải là giải pháp. Vui lòng tham khảo bài đăng gốc của tôi. –

+1

Đó là nó cho tôi, tôi sao chép qua mã từ ứng dụng WPF tôi đã thử nghiệm và tôi đã gỡ bỏ bộ điều khiển IControllerFactoryFactory = \t \t \t \t \t new UnityControllerFactory (_container); \t \t \t ControllerBuilder.Current.SetControllerFactory (controllerFactory); – rball

6

Các lớp tùy chỉnh của bạn trong hành động args phải có một hàm tạo tham số để sử dụng trình kết nối mô hình mặc định. Nếu không, hoặc (1) tạo một mô hình tùy chỉnh chất kết dính hoặc (2) vượt qua các kiểu nguyên thủy thay vì các lớp tùy chỉnh cho Hành động.

+0

Cảm ơn câu trả lời. Đây thực sự là điều đầu tiên tôi kiểm tra vì đó là điều hiển nhiên nhất có thể xảy ra. Họ có một ctor parles. Tôi sử dụng cùng một đối tượng trong suốt phần còn lại trang web của tôi thành công. –

6

Tôi cũng có các thuộc tính trong lớp mô hình chế độ xem của mình trả về các cá thể SelectList. Tôi trang trí lớp học của tôi với các thuộc tính Bind để loại trừ các tài sản như thế này:

[Bind(Exclude = "Countries")] public class MyViewModel { ...

public SelectList Countries { get; set; } 

}

Hy vọng rằng sẽ giúp, Roger

+0

Vì vậy, sau đó các giá trị danh sách lựa chọn cần phải được lấy ra từ bộ sưu tập biểu mẫu. –

+0

Điều này đã giúp tôi trong thời gian lớn. Cảm ơn! –

0

Các gốc rễ của vấn đề của tôi cũng là SelectList.

Tôi có điều này:

<%: Html.DropDownListFor(m => Model.Destinations, Model.Destinations)%> 

Khi nào tôi nên đã có này:

<%: Html.DropDownListFor(m => Model.Destination, Model.Destinations)%> 

Destination là lựa chọn của người dùng, điểm đến là danh sách các giá trị có thể. Sử dụng SelectList số nhiều hai lần gây ra vấn đề.

7

Đối với những Googling ngoại lệ này, đây là một cách tổng quát hơn để chẩn đoán nó:

Cách duy nhất dễ dàng Tôi đã tìm thấy để chẩn đoán vấn đề này là để ghi đè MVC càng gần với ngoại lệ càng tốt với riêng bạn mã. Sau đó, mã của bạn sẽ phá vỡ bên trong Visual Studio khi ngoại lệ này xảy ra và bạn có thể đọc Loại gây ra sự cố từ theo dõi ngăn xếp.

Điều này có vẻ giống như một cách khủng khiếp để tiếp cận vấn đề này, nhưng nó rất nhanh và rất nhất quán.

Ví dụ, nếu lỗi này đang xảy ra bên trong MVC DefaultModelBinder (mà bạn sẽ biết bằng cách kiểm tra stack trace), sau đó thay thế DefaultModelBinder với mã này:

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

Và cập nhật Global.asax của bạn. cs:

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

Bây giờ, bạn có thể kiểm tra thuộc tính "modelType" để xem loại nào gây ra sự cố.

Ví dụ ở trên hoạt động khi bạn nhận được "Không có hàm tạo tham số không được định nghĩa cho đối tượng này" ngoại lệ trong suốt quá trình gắn kết mô hình, chỉ. Nhưng mã tương tự có thể được viết cho các điểm mở rộng khác trong MVC (ví dụ: xây dựng bộ điều khiển).

+0

Tôi đã tìm kiếm điều này trong một thời gian dài. Cảm ơn bạn! Mọi người: hãy tiết kiệm thời gian và thử điều này trước. Tôi gọi tôi là "DebuggableModelBinder" và tôi sẽ bình luận nó ra khỏi Global.asax.cs và để nó ở đó trong lần tiếp theo. –

Các vấn đề liên quan