ASP.NET MVC: Không có hàm tạo không tham số nào được xác định cho đối tượng này


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

Tôi đã theo dõi cuốn sách ' Pro ASP.NET MVC Framework ' của Steven Sanderson . Trên trang 132, theo khuyến nghị của tác giả, tôi đã tải xuống tập hợp ASP.NET MVC Futures và thêm nó vào dự án MVC của tôi. [Lưu ý: Đây có thể là cá trích đỏ.]

Sau này, tôi không thể tải dự án của mình được nữa. Các lỗi trên làm tôi ngừng lạnh.

Câu hỏi của tôi không phải là "Bạn có thể giúp tôi sửa mã của mình không?"

Thay vào đó, tôi muốn biết nhiều hơn về tổng quát:

  • Tôi nên khắc phục sự cố này như thế nào?
  • Tôi nên tìm kiếm cái gì?
  • Nguyên nhân gốc rễ có thể là gì?

Có vẻ như tôi nên hiểu định tuyến và bộ điều khiển ở mức sâu hơn bây giờ.

Câu trả lời:


226

Tôi chỉ có một vấn đề tương tự. Ngoại lệ tương tự xảy ra khi a Modelkhông có hàm tạo không tham số.

Ngăn xếp cuộc gọi đã tìm ra một phương thức chịu trách nhiệm tạo ra một thể hiện mới của một mô hình.

System.Web.Mvc.DefaultModelBinder. CreateModel (ControllerContext điều khiểnContext , ModelBindingContext bindContext, Type modelType)


Đây là một mẫu:

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
Khi POST dữ liệu JSON cho hành động của tôi, tôi đã gặp một lỗi tương tự. Hóa ra mô hình của tôi mà nó đang cố gắng liên kết để không có hàm tạo không tham số!
Tim

1
NB: Tôi chỉ gặp vấn đề này (không có tham số bla bla ...) trong quá trình tuần tự hóa nếu tôi xác định một hàm tạo, và không phải là một đối số không tham số. Ý tôi là, trong ví dụ này, nếu bạn xóa hàm tạo mà bạn đã xác định (công khai MyModel (trình trợ giúp IHelper) {}) thì vấn đề sẽ biến mất ... vì vậy mỗi khi bạn tạo một hàm tạo, bạn phải tạo một tham số ... Tôi có thể hiểu giống như: một khi bạn bắt đầu xác định một hàm tạo, hệ thống sẽ không mạo hiểm để tạo ra 'các đối tượng mặc định' bởi vì nó không biết liệu nó có ý nghĩa gì không ...
H_He

1
Tuples ... có thể đối với một số người khác đến đây: nếu bạn chỉ có Tuples (như Tuple <chuỗi, chuỗi> dữ liệu;) trong lớp của bạn, việc tuần tự hóa sẽ ổn (vì tôi gặp phải vấn đề này trong quá trình tuần tự hóa JSON) ... nhưng nếu bạn sử dụng một cái gì đó như Danh sách <Tuple <chuỗi, chuỗi >> dữ liệu; bạn sẽ bắt đầu gặp lỗi 'không có tham số không tham số'. Bởi vì .Net không thể / không tạo Tuples (Tôi không có ref cho điều đó nhưng Tuple <chuỗi, chuỗi> data = new Tuple <chuỗi, chuỗi> (); sẽ không biên dịch ... trong khi Tuple <chuỗi, chuỗi> dữ liệu = Tuple mới <chuỗi, chuỗi> ("", ""); vẫn ổn.
H_He

3
Vâng, nhưng làm thế nào để bạn thêm một hàm tạo không tham số vào một lớp có các phụ thuộc và bạn muốn thêm chúng vào hàm tạo? Đó là một phần của vấn đề tôi không gặp phải ...
EluciusFTW

2
@ToaoG thư viện tiêm phụ thuộc của bạn sẽ cung cấp cho bạn một cách để chọn "hàm tạo tiêm". Btw, có tiêm phụ thuộc trong viewmodels trông kỳ lạ.
SandRock

89

Điều này cũng có thể được gây ra nếu Model của bạn đang sử dụng SelectList, vì điều này không có hàm tạo không tham số :

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

Bạn sẽ cần cấu trúc lại mô hình của mình để thực hiện theo cách khác nếu đây là nguyên nhân. Vì vậy, sử dụng một IEnumerable<Contact>và viết một phương thức mở rộng để tạo danh sách thả xuống với các định nghĩa thuộc tính khác nhau:

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

Hoặc bạn có thể sử dụng cách tiếp cận @Mark và @krilovich, chỉ cần thay thế SelectList thành IEnumerable, nó cũng hoạt động với MultiSelectList.

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

1
Tôi đã lãng phí quá nhiều thời gian cho việc này ... và phải biến chức năng trợ giúp của mình đang trả lại một Danh sách chọn thành một danh sách sẽ trả về Danh sách <SelectListItem> .... blarg
Đánh dấu

Bạn có thể sử dụng IEnumerable <SelectListItem> và khởi tạo chúng trong hàm tạo của bạn dưới dạng Danh sách mới <SelectListItem> ()
krilovich

Cảm ơn bạn 3,5 năm sau!
tonyapolis 4/2/2015

Cảm ơn bạn điều này là vô cùng hữu ích!
Kevin Coulson

Vẫn còn hiệu lực 5 năm sau. Cảm ơn!
Neill

23

Bạn cần hành động tương ứng với bộ điều khiển để không có tham số.

Có vẻ như đối với tổ hợp điều khiển / hành động bạn có:

public ActionResult Action(int parameter)
{

}

nhưng bạn cần

public ActionResult Action()
{

}

Ngoài ra, hãy xem Trình gỡ lỗi Tuyến của Phil Haack để khắc phục sự cố các tuyến đường.


6
Ngoại lệ có liên quan đến Trình xây dựng, không phải phương thức hành động.
Jason Wicker

4
@Logrybeatik. Ngoại lệ được báo cáo là dành cho hàm tạo, nhưng vấn đề nằm ở phương thức hành động. Tôi đã có một lớp và phương thức hành động đang hoạt động, sau đó thêm một tham số cho phương thức hành động và gặp lỗi này. Một giải pháp thay thế là cung cấp một giá trị cho tham số. Hoặc đặt tham số tùy chọn - điều này sẽ hoạt động khi bộ điều khiển ở C #, nhưng nó không phù hợp với tôi với F #
Stephen Hosking

Ngoài ra, nếu bạn đang làm một cái gì đó như @ Html.Action ("someAction", {myParameter = "42"}) mới, hãy đảm bảo rằng tên của tham số trong lệnh gọi Html.Action của bạn khớp với tên của tham số được xác định trong phương pháp hành động của bạn!
JT Taylor

20

Theo mặc định, Bộ điều khiển MVC yêu cầu một hàm tạo mặc định không có tham số. Đơn giản nhất sẽ là tạo một hàm tạo mặc định gọi hàm có tham số:

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

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

Tuy nhiên, bạn có thể ghi đè chức năng này bằng cách tự lăn ControllerFactory. Bằng cách này, bạn có thể nói với MVC rằng khi bạn đang tạo một MyControllerví dụ vềHelper .

Điều này cho phép bạn sử dụng các khung Dependency Injection với MVC và thực sự tách rời mọi thứ. Một ví dụ điển hình về việc này đã kết thúc tại trang web StructMap . Toàn bộ phần khởi động là tốt và anh ấy đặc biệt với MVC về phía dưới tại "Tự động nối dây".


6
Tôi không nghĩ đây là câu trả lời đúng, @swilliams. Chìa khóa ở đây là phần: được xác định cho đối tượng này . Đó là một thông báo lỗi tào lao thực sự gợi ý về (các) MÔ HÌNH INPUT được truyền vào không thể được tạo. Vì vậy, nếu bạn có một mô hình đầu vào không có hàm tạo không tham số, thì bạn sẽ gặp lỗi này. Rất dễ nghĩ rằng nó có liên quan đến hàm tạo CONTROLLER. Nhưng nó không phải là.
Pure.Krom

1
Đó là một tin nhắn tào lao, sẽ đưa bạn vào một cuộc rượt đuổi ngông cuồng nếu không có câu trả lời như thế này. Nhờ câu trả lời này và câu trả lời ở trên, tôi đã có thể khiến mọi thứ bình phương. Tôi đoán đó là vấn đề không hiểu đầy đủ những gì chất kết dính đang làm đằng sau hậu trường. Tôi hình dung nó sẽ chỉ đặt từng thuộc tính nhưng vì một lý do nào đó, nó sẽ gọi get trước khi cài đặt. Vì vậy, vì tôi đã quá tải công cụ xây dựng của mình và phải bù với một tham số ít hơn công cụ xây dựng, tôi đã phải tính đến null một số tài sản của tôi nhận được, điều này cũng bất ngờ.
Eaglei22

18

Lỗi này cũng xảy ra khi sử dụng IDependencyResolver , chẳng hạn như khi sử dụng bộ chứa IoC và trình phân giải phụ thuộc trả về null. Trong trường hợp này, ASP.NET MVC 3 mặc định sử dụng DefaultControllActivator để tạo đối tượng. Nếu đối tượng được tạo không có hàm tạo không có đối số công khai thì một ngoại lệ sẽ được ném bất cứ khi nào trình giải quyết phụ thuộc được cung cấp đã trả về null.

Đây là một dấu vết ngăn xếp như vậy:

[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
Điều này gây ra vấn đề của tôi: Trình giải quyết phụ thuộc của tôi không thể xây dựng bộ điều khiển của tôi vì một ngoại lệ. Nó đã bị trình phân giải nuốt, trả về null và khung MVC chuyển sang trình kích hoạt bộ điều khiển mặc định dẫn đến lỗi được mô tả.
Beriz

@ jmona789 Kiểm tra xem bạn đã đặt tất cả các phụ thuộc được tiêm trong Global.asax chưa.
aloisdg chuyển đến codidact.com

13

Bạn có thể có ngoại lệ này ở nhiều vị trí khác nhau trong khung MVC (ví dụ: nó không thể tạo bộ điều khiển hoặc nó không thể tạo một mô hình để cung cấp cho bộ điều khiển đó).

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

Đây có vẻ là 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 xảy ra bên trong MVC DefaultModelBinder (mà bạn sẽ biết bằng cách kiểm tra theo dõi ngăn xếp), sau đó thay thế DefaultModelBinder bằng 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.cs của bạn:

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

Bây giờ, lần tới khi bạn có ngoại lệ đó, Visual Studio sẽ dừng bên trong lớp MyDefaultModelBinder của bạn và 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 ngoại lệ "Không có hàm tạo không tham số được xác định cho đối tượng này" trong khi liê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ụ: bộ điều khiển xây dựng).


Đó là những gì tôi đã nghĩ làm cho vấn đề của tôi.
Doug Chamberlain

Ước gì tôi có thể nâng cao điều này hơn nữa. Tiết kiệm cho tôi hơn một vài phút thời gian của tôi.
Keith

8

Tôi đã có cùng một lỗi, thủ phạm trong trường hợp của tôi là nhà xây dựng không công khai cũng không riêng tư .

Không có hàm tạo không tham số được xác định cho đối tượng này.

Chi tiết ngoại lệ: System.MissingMethodException: Không có hàm tạo không tham số nào được xác định cho đối tượng này.

Mã repro: Đảm bảo hàm tạo có công khai trước nó.

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

    public string name
    {
        get;
        set;
    }
}

4
Cũng như một lưu ý, thiếu các sửa đổi truy cập trên một hàm tạo mặc định thành "nội bộ" trong trình biên dịch.
lsuarez

1
đặt ở đó sửa đổi "riêng tư" sẽ không giải quyết vấn đề.
krzyski

7

Video đầu tiên trên http://tekpub.com/conferences/mvcconf

47:10 phút hiển thị lỗi và hiển thị cách ghi đè Bộ điều khiển mặc định. Tức là để tạo cấu trúc điều khiển bản đồ nhà máy.

Về cơ bản, có lẽ bạn đang cố gắng thực hiện tiêm phụ thuộc ??

Vấn đề là sự phụ thuộc giao diện.


Và bạn có thể nhận được lớp StructMapControllFactory từ dự án MVC Storefront
Gautam Jain

6

Tôi đã gặp lỗi tương tự khi:

Sử dụng ModelView tùy chỉnh, cả hai Hành động (GET và POST) đều truyền ModelView có chứa hai đối tượng:

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

Và POST cũng chấp nhận chế độ xem mô hình tương tự:

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

Vấn đề là Chế độ xem đã nhận ModelView (cần cả thông tin về danh mục sản phẩm và danh mục), nhưng sau khi gửi, chỉ trả về đối tượng Sản phẩm, nhưng vì POST Add mong đợi một ProductModelView, nó đã vượt qua NULL nhưng sau đó, hàm tạo của ProductModelView chỉ cần hai tham số ( Sản phẩm, RootC loại), sau đó nó đã cố gắng tìm một hàm tạo khác không có tham số cho trường hợp NULL này sau đó không thành công với "không có tham số ..."

Vì vậy, sửa lỗi POST Thêm như sau để khắc phục sự cố:

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

Hy vọng điều này có thể giúp được ai đó (tôi đã dành gần nửa ngày để tìm ra điều này!).


Nestor, điều này là khai sáng và có vẻ đúng. Nhưng tại sao Chế độ xem trả về một đối tượng khác thì nó đang nhận, tức là đối tượng Sản phẩm chứ không phải ProductViewModel?
GilShalit

Ồ, điều này là cụ thể cho trường hợp của tôi, vì tôi chỉ cần giữ dữ liệu cho Sản phẩm, các RootC loại được chuyển đến chế độ xem chỉ để in ra, không có đầu vào nào được thực hiện trên đó, vì vậy giá trị của chúng (RootC loại) không được giữ trong <đầu vào > hoặc bất cứ nơi nào khác. Nếu tôi cần giữ ViewModel, tôi sẽ tiếp tục sử dụng biểu mẫu <input>, dữ liệu xem hoặc một cái gì đó khác.
Nestor

GilShalit, hôm nay tôi đã tìm thấy câu trả lời (xin lỗi, tôi chậm!), Nhìn vào HTML được hiển thị, tôi thấy đầu vào có tên [ObjectName]. [Thuộc tính], nhưng không có dấu vết của ViewModel gốc, vì vậy bạn chỉ có thể truy xuất từng cá nhân đối tượng bên trong ViewModel, nhưng không phải chính ViewModel hoàn chỉnh. Ví dụ :, nếu ProductViewModel vm của bạn có bên trong các đối tượng Product p và Category c, thì bộ điều khiển GET của bạn sẽ gửi một mô hình vm đến View, sau đó bộ điều khiển POST của bạn chỉ có thể chấp nhận các tham số như (Product p, Category c), chứ không phải vm. .. nếu tôi sai sẽ đánh giá cao một số thông tin phản hồi.
Nestor

5

Tôi cũng vậy. Vấn đề của tôi xuất hiện bởi vì tôi quên rằng lớp mô hình cơ sở của tôi đã có thuộc tính với tên được xác định trong dạng xem .

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

... và mô hình xử lý bộ điều khiển:

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

Không có gì đặc biệt, phải không? Nhưng sau đó tôi xác định quan điểm ...

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

... gây ra lỗi "Parameterless constructor" trong yêu cầu POST.

Mong rằng sẽ giúp.


5

Tôi đã có một vấn đề tương tự, và về cơ bản, có một số đối số trong phương thức hành động không được cung cấp bởi quy trình Binding Model, và nói cách khác, các trường này không được gửi bởi trang gửi).

Vấn đề này sẽ xuất hiện ngay cả khi tất cả các đối số ngoại trừ một đối số được cung cấp và ngay cả khi đối số bị thiếu là loại không thể.

Vấn đề cũng có thể là kết quả của một lỗi đánh máy, trong đó tên của đối số và tên của trường biểu mẫu sẽ không giống nhau.

Giải pháp là 1) xác minh rằng các tên khớp với 2) cung cấp giá trị mặc định cho đối số 3) hoặc cung cấp phương thức hành động khác mà không có đối số này.


Cảm ơn @yo hal, câu trả lời của bạn hóa ra là câu trả lời cho trường hợp cụ thể của tôi về lỗi này. Thông báo lỗi khung công tác xuất hiện là thông báo lỗi ít hữu ích nhất trong trường hợp này.
Scott Lawrence

4

Tôi cũng gặp vấn đề này và nghĩ rằng tôi muốn chia sẻ vì tôi không thể tìm thấy vấn đề của mình ở trên.

Đây là mã của tôi

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

Gọi đây là ActionResult:

public ActionResult Overview(int id)

Tôi cho rằng nó sẽ đủ thông minh để nhận ra rằng giá trị tôi vượt qua nó là tham số id cho Tổng quan, nhưng thực tế không phải vậy. Điều này đã sửa nó:

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


4

Tôi đã có ngoại lệ tương tự do không có công cụ điều phối không tham số

Mã là như thế này:

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

thay đổi để

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

vấn đề được giải quyết cho tôi.


Tôi đã gặp vấn đề tương tự khi sử dụng một hàm tạo được bảo vệ trong lớp cơ sở - dường như là một giải pháp rõ ràng bây giờ!
keithl8041

4

Tất cả các câu trả lời đều nói rằng để tạo một tham số ít hàm tạo không lý tưởng nếu bạn không muốn bất kỳ nhà phát triển nào khác sử dụng nó và chỉ có chất kết dính mô hình.

Thuộc tính [Obsolete("For model binding only", true)]phía trên một hàm tạo công khai sẽ đưa ra lỗi trình biên dịch nếu một nhà phát triển khác cố gắng sử dụng nó. Mất nhiều năm để tìm thấy điều này, hy vọng nó sẽ giúp được ai đó.


Hoàn hảo - việc thêm thuộc tính này cho phép mô hình MVC liên kết hoạt động trong thời gian chạy và đặt tham số boolean của thuộc tính thành đúng ngăn chặn (tại thời gian biên dịch) bất kỳ nỗ lực nào để khởi tạo hàm tạo không tham số. Câu trả lời tốt nhất ở đây.
Greg Trevellick

3

Tôi đã nhận được lỗi này. Tôi đã sử dụng các giao diện trong hàm tạo của mình và trình giải quyết phụ thuộc của tôi không thể giải quyết, khi tôi đăng ký thì lỗi đã biến mất.


Nếu bạn có một câu hỏi mới, xin vui lòng gửi nó như vậy. Đây phải là một bình luận hoặc một câu hỏi mới vì nó không cố gắng trả lời vấn đề.
Nahuel Ianni

2

Tôi đã từng gặp vấn đề tương tự...

Nếu bạn sử dụng giao diện để tách kết nối của bạn với DbContext (như tôi), bạn có thể sử dụng structuremap.mvc (gói 3 hoặc 4 - nocate ) để có thể sử dụng cấu trúc trong lớp trình điều khiển của bạn. Điều này sẽ cung cấp cho bạn một thư mục DependencyResolution. Chỉ cần thay đổi dòng nhận xét bằng For <InterfaceClass> () và sử dụng <DbContextClass> ().


2

Mặc dù điều này có thể rõ ràng với một số người, thủ phạm gây ra lỗi này đối với tôi là phương thức MVC của tôi đã ràng buộc với một mô hình có chứa thuộc tính loại Tuple<>. Tuple<>không có hàm tạo không tham số.


1

Tôi gặp vấn đề tương tự nhưng sau đó phát hiện thêm bất kỳ giao diện mới nào và lớp tương ứng yêu cầu nó phải được đăng ký theo Mô-đun khởi tạo để tiêm phụ thuộc. Trong trường hợp của tôi, nó là mã bên trong như sau:

[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

Trong trường hợp của tôi, lớp của tôi có [Serializable]thuộc tính.

Bạn được yêu cầu phải có một hàm tạo không có tham số nếu lớp của bạn là [Serializable]


0

Lỗi này bắt đầu với tôi khi tôi thêm một cách mới để khởi tạo một lớp.

Thí dụ:

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

Lỗi đã được khắc phục khi tôi thêm khi tôi thực hiện thay đổi này, thêm một hàm tạo không tham số. Tôi tin rằng trình biên dịch tạo ra một bộ dẫn không tham số theo mặc định nhưng nếu bạn thêm cái riêng của mình thì bạn phải tạo nó một cách rõ ràng.

    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

Tôi đã thêm một DropDownListvào biểu mẫu của mình, tuy nhiên trong trường hợp của tôi, nó không (và không có ý định) được gửi với biểu mẫu vì nó nằm ngoài các <form></form>thẻ:

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

Vì Model chỉ chứa trường để hiển thị, điều này cũng gây ra No parameterless constructor defined for this objectlỗi vì trường không được gửi.

Trong trường hợp này, tôi đã sửa nó bằng cách thêm một ràng buộc loại trừ:

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

0

Điều này đã xảy ra với tôi và kết quả trên trang này là một nguồn tốt dẫn tôi theo nhiều hướng, nhưng tôi muốn thêm một khả năng khác:

Như đã nêu trong các trả lời khác, việc tạo một hàm tạo với các tham số sẽ loại bỏ hàm tạo không tham số ngầm định, do đó bạn phải gõ nó một cách rõ ràng.

Vấn đề của tôi là một hàm tạo có tham số mặc định cũng kích hoạt ngoại lệ này.

Đưa ra lỗi:

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

Làm:

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

0

Rất có thể bạn có thể có hàm tạo được tham số hóa trong bộ điều khiển của mình và bất kỳ trình phân giải phụ thuộc nào bạn đang sử dụng đều không thể giải quyết đúng phụ thuộc. Bạn cần đặt điểm dừng trong đó phương thức trình giải quyết phụ thuộc được viết và bạn sẽ nhận được lỗi chính xác trong ngoại lệ bên trong.


0

Tôi đã từng gặp vấn đề tương tự.

Chỉ cần xóa HttpFileCollectionBase fileskhỏi đối số phương thức Post Action và thêm như HttpFileCollectionBase files = Request.Files;trong phần thân phương thức.


0

Tôi đã thêm một hàm tạo không tham số vào mô hình bên trong Thư mục DOMAIN và vấn đề được giải quyết.

nhập mô tả hình ảnh ở đây

 public User()
        {

        }

-3

Vì vậy, tôi cũng đã nhận được tin nhắn đó trước khi thực hiện cuộc gọi ajax. Vì vậy, những gì về cơ bản nó yêu cầu là một hàm tạo trong lớp mô hình đó đang được gọi bởi trình điều khiển, không có bất kỳ tham số nào.

Đây là một ví dụ

public class MyClass{

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

 }

Tôi loại bỏ constructor mặc định khỏi mô hình, điều này làm việc cho tôi.
Musakkhir Sayyed
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.