ASP.NET MVC: для этого объекта не определен конструктор без параметров - PullRequest
162 голосов
/ 31 августа 2009
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 ». На странице 132 в соответствии с рекомендацией автора я загрузил сборку ASP.NET MVC Futures и добавил ее в свой проект MVC. [Примечание: это может быть красная сельдь.]

После этого я больше не мог загружать свой проект. Вышеуказанная ошибка остановила меня холодным.

Мой вопрос , а не , «Не могли бы вы помочь мне исправить мой код?»

Вместо этого я хотел бы знать более широко:

  • Как мне решить эту проблему?
  • Что я должен искать?
  • Какая может быть основная причина?

Кажется, я должен понимать маршрутизацию и контроллеры на более глубоком уровне, чем сейчас.

Ответы [ 25 ]

5 голосов
/ 31 августа 2011

То же самое для меня. Моя проблема возникла из-за того, что я забыл, что мой базовый класс уже имеет свойство с именем, определенным в представлении .

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.

Надеюсь, это поможет.

4 голосов
/ 08 ноября 2011

У меня тоже была эта проблема, и я решил поделиться, так как не могу найти свою проблему выше.

Это был мой код

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

Вызов этого результата действия:

public ActionResult Overview(int id)

Я предположил, что было бы достаточно умен, чтобы выяснить, что значение, которое я передаю, является параметром id для Overview, но это не так. Это исправлено:

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

4 голосов
/ 16 января 2014

Я получил то же исключение, потому что не было общедоступного конструктора без параметров

Код был такой:

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

изменено на

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

проблема решена для меня.

2 голосов
/ 03 января 2013

У меня была такая же проблема ...

Если вы используете интерфейс для разъединения вашего соединения с вашим DbContext (как я), вы можете использовать structuremap.mvc (3 или 4 - пакет nudget ), чтобы иметь возможность использовать конструкция в вашем классе контроллера. Это даст вам папку DependencyResolution. Просто измените закомментированную строку с помощью For () и используйте ().

2 голосов
/ 08 мая 2013

Хотя для некоторых это может быть очевидно, виновником этой ошибки для меня было то, что мой метод MVC был привязан к модели, содержащей свойство типа Tuple<>. Tuple<> не имеет конструктора без параметров.

2 голосов
/ 13 июля 2016

Все ответы говорят о создании конструктора без параметров, который не идеален, если вы не хотите, чтобы другие разработчики использовали его и только связыватель модели.

Атрибут [Obsolete("For model binding only", true)] над открытым конструктором выдаст ошибку компилятора, если другой разработчик попытается использовать это. Мне понадобилось много времени, чтобы найти это, надеюсь, это кому-нибудь поможет.

2 голосов
/ 29 августа 2016

Я получил эту ошибку. Я использовал интерфейсы в своем конструкторе, и мой распознаватель зависимостей не смог разрешить, когда я зарегистрировал его, ошибка исчезла.

0 голосов
/ 01 ноября 2018

В моем случае мой класс имел атрибут [Serializable].

Вы должны иметь конструктор, который не принимает параметров, если ваш класс [Serializable]

0 голосов
/ 13 апреля 2018

У меня была такая же проблема.

Только что удалено HttpFileCollectionBase files из аргумента метода Post Action и добавляется как HttpFileCollectionBase files = Request.Files; в тело метода.

0 голосов
/ 17 июля 2017

У меня была такая же проблема, но позже я обнаружил, что добавление любого нового интерфейса и соответствующего класса требует, чтобы он был зарегистрирован в Initializable Module для внедрения зависимостей. В моем случае это было внутри кода следующим образом:

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

}

...