Html.BeginForm使用action / 1调用错误的URL

时间:2014-12-15 11:24:38

标签: c# asp.net-mvc asp.net-mvc-4

在我的应用程序中,我在" / 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,它有一个自定义构造函数但没有默认构造函数......这就是错误!

如何使此表单与此控制器一起使用?

提前致谢

1 个答案:

答案 0 :(得分:-1)

当您对具有参数的操作发出请求时,MVC会尝试为您创建这些参数,并使用来自请求正文,路由值,查询字符串的数据填充它们(这些是值)提供者)。

此过程称为&#34;模型绑定&#34;。并且,如果有一个参数是一个对象,如AddFundToProjectViewModel model,模型绑定的第一步是创建该对象的空实例,它需要一个默认的(无参数)构造函数。

构建对象后,它会尝试使用适当的名称设置来自值提供程序的属性值。

默认情况下,所有类都有一个默认(无参数)构造函数。但是,如果使用参数定义构造函数,则不提供默认构造函数。因此,要解决您的问题,请在AddFundToProjectViewModel类中添加无参数构造函数,以便模型绑定器可以完成其工作。