在我的应用程序中,我在" / Project / AddFund / 1"中有一个表单。 :
@using (Html.BeginForm("AddFund", "Project", FormMethod.Post))
{
@Html.AntiForgeryToken()
<div>
...
<input type="submit" value="Save" class="btn btn-default" />
</div>
}
但是渲染的html是
<form method="post" action="/Project/AddFund/1" novalidate="novalidate"><input type="hidden" value="tM8Gdmnki5mdHiTeuc9m_Ga_LY0hPhuSyAiXs6Ae9yedUn9h-sS-ihBC5Iy3NZtrxBmA7TRbV_jEPgvztuHT3Y6seGZvaLWJUemwg2_5OBR23dVELfJ1wHb0pvAcAOuu0huy_PzAozsQtxZUSBFUQw2" name="__RequestVerificationToken"> <div>
...
</form>
在我的控制器中,此方法必须捕获表单提交但由于带有/ id的URL确实无法正常工作,因此永远不会调用控制器的代码:
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult AddFund(AddFundToProjectViewModel model)
{...}
这是一个例外:
No parameterless constructor defined for this object. [MissingMethodException: No parameterless constructor defined for this object.] exception is thrown
正如StephenMuecke在评论中所说,我使用了一个ModelView,它有一个自定义构造函数但没有默认构造函数......这就是错误!
如何使此表单与此控制器一起使用?
提前致谢
答案 0 :(得分:-1)
当您对具有参数的操作发出请求时,MVC会尝试为您创建这些参数,并使用来自请求正文,路由值,查询字符串的数据填充它们(这些是值)提供者)。
此过程称为&#34;模型绑定&#34;。并且,如果有一个参数是一个对象,如AddFundToProjectViewModel model
,模型绑定的第一步是创建该对象的空实例,它需要一个默认的(无参数)构造函数。
构建对象后,它会尝试使用适当的名称设置来自值提供程序的属性值。
默认情况下,所有类都有一个默认(无参数)构造函数。但是,如果使用参数定义构造函数,则不提供默认构造函数。因此,要解决您的问题,请在AddFundToProjectViewModel
类中添加无参数构造函数,以便模型绑定器可以完成其工作。