MissingMethodException: «Нет конструктора без параметров для этого объекта» - PullRequest
4 голосов
/ 19 июля 2011

Отказ от ответственности: Да, я гуглил и прочитал шесть или около того первых хитов, искал на SO и нашел много из других сообщений , но ни один из них не помог мне решить эту проблему ... Этот , и в частности этот ответ , кажется, подошел довольно близко, но я все еще не могу понять это.Поэтому, пожалуйста, потерпите меня, хотя я, кажется, задаю вопрос, который задавался много раз раньше.

Вопрос

Когда я отправляю форму, я получаю System.MissingMethodExceptionговоря: «Для этого объекта не определен конструктор без параметров».Кажется, для этого есть ряд различных, довольно распространенных причин - две наиболее заметные из них - отсутствие в контроллере конструктора по умолчанию и не удовлетворение его зависимостей, когда инфраструктура DI пытается разрешить его, соответственно модель вводау метода действия нет конструктора по умолчанию.Из моей трассировки стека, я пришел к выводу, что последняя, ​​кажется, моя проблема - однако, я никуда не пытался решить эту проблему.

Справочная информация

Моя трассировка стека:

[MissingMethodException: для этого объекта не определен конструктор без параметров.]

System.RuntimeTypeHandle.CreateInstance (тип RuntimeType, логическое значение publicOnly, логическое значение noCheck, логическое значение & canBeCached, RuntimelecklessControl_SecurityHecurityHextHehoD)0
System.RuntimeType.CreateInstanceSlow (логическое значение publicOnly, логическое значение skipCheckThis, логическое значение fillCache) + 117
System.RuntimeType..CreateInstance (тип Type, логическое значение nonPublic) + 106
System.Web.Mvc. DefaultModelBinder .CreateModel (ControllerContext controllerContext, ModelBindingContext bindingContext, тип modelType) + 243
System.Web.c.DefaultModelBinder.BindComplexModel (ControllerContext controllerContext, ModelBindingContext bindingContext) + 151
и т. д. ... продолжается некоторое время ...

Однако моя модель имеет Конструктор без параметров (см. код ниже)!

Моя подпись метода действия POST:

[HttpPost]
public ActionResult AddObject(InspectionObjectEditModel input, IUser user)
// IUser is passed with a custom model binder, that is verified to work

Мой метод действия GET, отображающий форму:

public ActionResult CreateObject()
{
    var model = GetEditModelForID(0); // Calls new InspectionObjectEditModel()
    model.PostAction = "AddObject";
    return View(model);
}

The InspectionObjectEditModel:

public class InspectionObjectEditModel : ViewModel<InspectionObject, int>, IInspectionObjectData
{
    // ReSharper warns on the constructor, because it's redundant
    public InspectionObjectEditModel() { }

    #region Properties for editing
    [Required]
    [DisplayNameLocalized("Littera")]
    public virtual string Littera { get; set; }
    [Required]
    [DisplayNameLocalized("IInspectionObjectData_Type")]
    public virtual InspectionObjectType Type { get; set; }
    [Required, NotNull]
    [DisplayNameLocalized("IInspectionObjectData_Name")]
    public virtual string Name { get; set; }
    [Required]
    [DisplayNameLocalized("IInspectionObjectData_Owner")]
    public virtual string Owner { get; set; }
    [Required]
    [DisplayNameLocalized("IInspectionObjectData_Address")]
    public virtual string Address { get; set; }
    [Required]
    [DisplayNameLocalized("IInspectionObjectData_Caretaker")]
    public virtual string Caretaker { get; set; }
    [DisplayNameLocalized("IInspectionObjectData_Remarks")]
    public virtual string Remarks { get; set; }
    [Required]
    [DisplayNameLocalized("IInspectionObjectData_X")]
    public virtual float PlacementX { get; set; }
    [Required]
    [DisplayNameLocalized("IInspectionObjectData_Y")]
    public virtual float PlacementY { get; set; }
    [Required]
    [DisplayNameLocalized("IInspectionObjectData_Z")]
    public virtual float PlacementZ { get; set; }
    #endregion

    #region Data for form elements
    public virtual List<InspectionObjectType> Types { get; set; }
    public virtual bool Geocode { get; set; }

    //public Expression<Action<InspectionController>> PostAction { get; set; }
    public virtual string PostAction { get; set; }
    #endregion

    #region Properties that won't be edited
    public virtual Project Project { get; set; }
    public virtual DateTime Created { get; set; }
    public virtual User CreatedByUser { get; set; }
    public virtual DateTime? LastUpdated { get; set; }
    public virtual User LastUpdatedByUser { get; set; }
    public IList<InspectionActivity> Activities { get; set; }
    #endregion
}

Ответы [ 3 ]

4 голосов
/ 19 июля 2011

Если InspectionObjectType не имеет конструктора без параметров, это может вызвать это исключение.Мало того, что вашему классу модели нужен конструктор без параметров, я думаю, что типы его общедоступных свойств тоже нужны.такой сложный класс для вашей модели.Я всегда предпочитал, чтобы мои модели представлений были максимально простыми - действительно простыми.Затем вы можете использовать автоматическое сопоставление для перехода к более полнофункциональному объекту или использовать агрегацию, или, если есть только несколько свойств, просто сделайте это свойство свойством в методе действия вашего контроллера.

2 голосов
/ 19 июля 2011

Проблема в том, что некоторые из типов, используемых в этой модели домена монстров, не имеют конструкторов по умолчанию: InspectionActivity, User, Project, InspectionObjectType или некоторые свойства, на которые они ссылаются, или некоторыеобъектов, используемых в базовом классе ViewModel<InspectionObject, int>.Использование моделей представлений действительно упростит задачу.

0 голосов
/ 28 января 2014

Вы забыли заполнить параметр? Выдает это исключение, когда вы не заполнили все параметры метода

...