【问题标题】:MissingMethodException: "No parameterless constructor for this object"MissingMethodException:“此对象没有无参数构造函数”
【发布时间】:2011-07-19 13:11:37
【问题描述】:

免责声明:是的,我已经阅读了 googled 并阅读了前六名左右的热门歌曲,searched on SOfound lots of other posts,但他们都没有帮助我解决了这个问题...This one,尤其是this answer,似乎非常接近,但我仍然无法弄清楚。因此,尽管我似乎问了一个以前被问过很多次的问题,但请多多包涵。

问题

当我提交表单时,我收到一个System.MissingMethodException,说“没有为此对象定义无参数构造函数”。这似乎有许多不同的,相当常见的原因 - 两个最突出的原因是控制器缺少默认构造函数并且当 DI 框架尝试解决它时没有满足它的依赖关系,分别是输入模型在 action 方法上没有默认构造函数。从我的堆栈跟踪中,我推断后者似乎是我的问题 - 但是,我无处可去试图解决这个问题。

背景资料

我的堆栈跟踪:

[MissingMethodException: 没有为此对象定义无参数构造函数。]

System.RuntimeTypeHandle.CreateInstance(RuntimeType 类型, Boolean publicOnly, Boolean noCheck, Boolean& canBeCached, RuntimeMethodHandleInternal& ctor, Boolean& bNeedSecurityCheck) +0
System.RuntimeType.CreateInstanceSlow(Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache) +117
System.RuntimeType.CreateInstanceDefaultCtor(布尔publicOnly,布尔skipVisibilityChecks,布尔skipCheckThis,布尔fillCache)+247
System.Activator.CreateInstance(类型类型,布尔非公共)+106
System.Web.Mvc.DefaultModelBinder.CreateModel(ControllerContext controllerContext, ModelBindingContext bindingContext, Type modelType) +243
System.Web.Mvc.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);
}

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
}

【问题讨论】:

    标签: asp.net-mvc model-binding


    【解决方案1】:

    如果 InspectionObjectType 没有无参数构造函数,则可能会导致该异常。您的模型类不仅需要无参数构造函数,我相信它的公共属性的类型也需要。

    编辑...

    我认为通过为模型使用如此复杂的类来增加出现问题的机会。我一直喜欢让我的视图模型尽可能简单——真的很简单。然后,您可以使用自动映射器转移到功能更全面的对象,或使用聚合,或者如果只有几个属性,只需在控制器操作方法中逐个属性地执行此操作。

    【讨论】:

    • InspectionObjectType 确实(以相同的冗余方式 InspectionObject 确实)具有默认构造函数。我以前使用过接口类型,但以防万一——这是否意味着我不能将IList&lt;T&gt;IEnumerable&lt;T&gt; 等作为属性类型?
    • 好的,我通过引入一个新的 InputModel 类解决了这个问题。我试图使用与检索更改相同的类型来呈现编辑视图,这不起作用,因为某些引用的类型没有构造函数。我不想改变它们,因为这是一个相当大的应用程序,我不想冒险破坏任何东西,但是引入另一个视图模型是可以的。新的 viewmodel 类只有永远存在的东西的属性。
    【解决方案2】:

    问题是这个怪物域模型中使用的一些类型没有默认构造函数:InspectionActivityUserProjectInspectionObjectType 或者它们引用的一些属性,或者一些基类ViewModel&lt;InspectionObject, int&gt; 中使用的对象。使用视图模型确实会让事情变得更简单。

    【讨论】:

      【解决方案3】:

      您是否忘记填写参数? 当您没有填写方法的所有参数时,它会抛出此异常

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-03-29
        • 2016-04-25
        • 2018-02-11
        • 1970-01-01
        相关资源
        最近更新 更多