Pramod Singh (C) Ответов: 4

Get error is "no parameterless constructor defined for this object."


Я получил ошибку:

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.




кодовая база :
namespace MVCSampleApplication.Controllers
{
    public class EmployeeController : Controller
    {

        IEmployee _IEmployee;
        public EmployeeController(IEmployee emp)
        {
            _IEmployee = emp ;
        }

        // GET: Employee
        public ActionResult Index()
        {
            var result = (from e in _IEmployee.GetEmployee()
                          select new Employee
                          {
                              EmpNo = e.EmpNo,
                              EmpName = e.EmpName,
                              Salary = e.Salary,
                              DeptName = e.DeptName,
                              Designation = e.Designation
                          }).ToList();
            return View(result);
            //return View();
        }


Что я уже пробовал:

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

Patrice T

"Пожалуйста, просмотрите трассировку стека для получения дополнительной информации об ошибке и о том, где она возникла в коде."
И что там написано ?

4 Ответов

Рейтинг:
31

F-ES Sitecore

Фреймворк MVC создает ваш контроллер, если вашему контроллеру нужен параметр в его конструкторе, то он должен быть создан следующим образом;

EmployeeController c = new EmployeeController(someEmployeeObject);


а MVC-это создание своего контроллера, что оно проходит как someEmployeeObject? При создании контроллеров MVC предполагает, что у вас есть то, что известно как конструктор без параметров, что означает, что он может создать его следующим образом;

EmployeeController c = new EmployeeController();


MVC может создать это прекрасно, так как ему не нужно ничего знать. Для этого вашему EmployeeController нужен конструктор без параметров

public EmployeeController()
{
}


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

Это исправит ошибку, но не вашу проблему. Ваш код все еще ожидает объект employee, так откуда же он берется? Мы не знаем вашей системы, поэтому не можем ответить на этот вопрос. Возможно, вам придется создать его самостоятельно в конструкторе без параметров.

Другая возможность заключается в том, что вы пытаетесь использовать контейнер IoC, но не зарегистрировали его. Чтобы иметь контроллер без параметрического конструктора, вам нужно зарегистрировать свой IoC с помощью

DependencyResolver.SetResolver(yourIoCContainer)[^]

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


Рейтинг:
26

DhruveshAkhani

Просто требуется добавить конструктор по умолчанию в ваш код.

namespace MVCSampleApplication.Controllers
{
    public class EmployeeController : Controller
    {
//Added Default Constructor
    public EmployeeController(){}
        IEmployee _IEmployee;
        public EmployeeController(IEmployee emp)
        {
            _IEmployee = emp ;
        }
 
        // GET: Employee
        public ActionResult Index()
        {
            var result = (from e in _IEmployee.GetEmployee()
                          select new Employee
                          {
                              EmpNo = e.EmpNo,
                              EmpName = e.EmpName,
                              Salary = e.Salary,
                              DeptName = e.DeptName,
                              Designation = e.Designation
                          }).ToList();
            return View(result);
            //return View();
        }
That will work 100%


Рейтинг:
20

OriginalGriff

Когда вы получаете сообщение об ошибке, которое не понимаете, отправьте его в Google: Для этого объекта не определен беспараметрический конструктор - поиск в Google[^]
Это дает тысячи других людей, задающих точно такой же вопрос и получающих ответ: модели MVC должны иметь конструктор без параметров.
Добавить это:

public EmployeeController()
{
}


Рейтинг:
1

Sanjeev Jyothikrishnan

Привет Прамод,

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

1) Если вы используете Unity, пожалуйста, убедитесь, что ниже добавлено в unityConfig.cs (в разделе App_start)

container.RegisterType<IEmployee, <<class name where you inherit the interface>>();


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

container.RegisterType<IEmployeeRepository, EmployeeRepository>();


IEmployeeRepository.cs
    public interface IEmployeeRepository
        {
            List<Employee> GetAllEmployees();
            Employee GetEmployeeByID(int ID);
    
        }


EmployeeRepository.cs
    public class EmployeeRepository : IEmployeeRepository
        {
            private readonly EmployeeEntities _employeeEntities;
    
            public EmployeeRepository(EmployeeEntities employeeEntities)
            {
                _employeeEntities = employeeEntities;
            }
            public List<Employee> GetAllEmployees()
            {
                return _employeeEntities.Employees.ToList();
            }
    
            public Employee GetEmployeeByID(int ID)
            {
                var employee = _employeeEntities.Employees.Where(e => e.EmpNo == ID).FirstOrDefault();
                return employee;
            }
        }
    }


2) в Global.asax, пожалуйста, зарегистрируйте unity, как показано ниже
UnityConfig.RegisterComponents();


Я видел людей, просящих добавить контроллер по умолчанию. если вы используете контроллер по умолчанию, инъекция зависимостей не будет работать. и вы должны использовать ключевое слово "new", которое строго типизировано. Это также дает вам нулевую ссылку, так как IEmployee ничем не инициализируется.

Надеюсь, это поможет!! Счастливого Кодирования!!


phil.o

Ошибка предполагает, что он находится в ASP.NET проект, так что это не имеет никакого отношения к единству. Более того, этот вопрос был задан и отмечен как ответ более четырех лет назад.