Ambiguous action method call, for some reason ASP.NET MVC 3

时光总嘲笑我的痴心妄想 提交于 2020-01-24 12:03:33

问题


ers! I'm a bit of a noob with this whole MVC thing, and I have run into a problem that I need some help with.

I am currently working on a project for a company that manages foster children, and the main part of this project is an MVC web app for some forms that foster parents must regularly submit to the company. My biggest problem so far has been saving the data that has been entered into the form back to the database. But I recently had a breakthrough when I realized that I could do this:

public ActionResult SaveForm(FormChildTherapeuticWeeklyForm formData)

Which is super awesome, and works perfectly for that first form. But after adding two more forms:

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

I have begun to get a The current request for action 'SaveForm' on controller type 'FormsController' is ambiguous between the following action methods: error.

While I know that I could just name each of the actions differently, I wanted to see if there was a better way to go about this since I ran into this error.

A little more info: each of the three views are strongly-typed to one of the three models/classes.

As I said, I'm still a bit of a noob with the MVC stuff, but I will try my best to provide any other information that you might need.

Thanks!


回答1:


Yes, it is better to provide different names for actions, in case they use differen Model classes as argument.

MVC framework uses so called Binders, to bind data that came from web form (or AJAX, or whatever) to CLR object. It is not trivial way to accomplish such binding, since it parse out data from url-encoded-form and tries to map to corresponding CRL object property.

Some object might have same property names, in this case Binder wan't be possible to understand how to make proper mapping;




回答2:


You could use the ActionNameAttribute to differentiate between them. That way you would do

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

And you'd have different routes/use the default route for each. Another way to do it would be to create your own implementation of the ActionFilterAttribute, which would rely on what is passed in, but that's more complicated.




回答3:


You can, as long as you differentiate them in one way or another. Look at this article for more information: Can you overload controller methods in ASP.NET MVC?




回答4:


You need to use ActionMethodSelectorAttribute in order to disambiguate between calls for those two methods.

See an example here : http://weblogs.asp.net/dfindley/archive/2009/05/31/asp-net-mvc-multiple-buttons-in-the-same-form.aspx




回答5:


You can resolve this by using attributes [HttpGet] and [HttpPost]. Applying those attributes will tell what method should be invoked for particular request type.



来源:https://stackoverflow.com/questions/6894766/ambiguous-action-method-call-for-some-reason-asp-net-mvc-3

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!