不明确的动作方法调用,由于某种原因ASP.NET MVC 3

时间:2011-08-01 06:19:24

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

ERS!对于整个MVC来说,我有点像菜鸟,我遇到了一个需要帮助的问题。

我目前正在为一家管理寄养儿童的公司开展一个项目,该项目的主要部分是一些MVC网络应用程序,用于培养父母必须定期提交给公司的一些表格。到目前为止,我最大的问题是将已输入表单的数据保存回数据库。但是当我意识到我能做到这一点时,我最近取得了突破:

public ActionResult SaveForm(FormChildTherapeuticWeeklyForm formData)

这是非常棒的,并且完美地适用于第一种形式。但是在添加了两个表单之后:

public ActionResult SaveForm(FormChildBasicCareMonthlyProgressReport formData)
public ActionResult SaveForm(FormFosterFamilyRequestForRemovalOrDischarge formData)

我已经开始得到一个 当前的控制器类型'FormsController'上的'SaveForm'请求在以下操作方法之间是不明确的: 错误。

虽然我知道我可以用不同的方式命名每个动作,但我想看看是否有更好的方法可以解决这个问题,因为我遇到了这个错误。

更多信息:三个视图中的每个视图都强类型为三个模型/类之一。

正如我所说,我仍然是MVC的一个菜鸟,但我会尽力提供您可能需要的任何其他信息。

谢谢!

5 个答案:

答案 0 :(得分:1)

您可以使用ActionNameAttribute来区分它们。那样你会做

[ActionName("Child")]
public ActionResult SaveForm(FormChildBasicCareMonthlyProgressReport formData)

你有不同的路线/使用每个路线的默认路线。另一种方法是创建自己的ActionFilterAttribute实现,它依赖于传入的内容,但这更复杂。

答案 1 :(得分:1)

只要您以某种方式区分它们,您就可以。请查看此文章以获取更多信息:Can you overload controller methods in ASP.NET MVC?

答案 2 :(得分:1)

是的,最好为动作提供不同的名称,以防它们使用不同的Model类作为参数。

MVC框架使用所谓的Binders,将来自Web表单(或AJAX或其他)的数据绑定到CLR对象。实现这种绑定并不是一种简单的方法,因为它从url-encoded-form中解析数据并尝试映射到相应的CRL对象属性。

某些对象可能具有相同的属性名称,在这种情况下,Binder无法理解如何进行正确的映射;

答案 3 :(得分:1)

您需要使用ActionMethodSelectorAttribute才能消除对这两种方法的调用之间的歧义。

请在此处查看示例:http://weblogs.asp.net/dfindley/archive/2009/05/31/asp-net-mvc-multiple-buttons-in-the-same-form.aspx

答案 4 :(得分:0)

您可以使用属性[HttpGet]和[HttpPost]解决此问题。应用这些属性将告诉应该为特定请求类型调用哪种方法。