Ambiguous action method call, for some reason ASP.

2019-07-05 09:59发布

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!

5条回答
Fickle 薄情
2楼-- · 2019-07-05 10:34

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

查看更多
女痞
3楼-- · 2019-07-05 10:39

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;

查看更多
4楼-- · 2019-07-05 10:42

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.

查看更多
手持菜刀,她持情操
5楼-- · 2019-07-05 10:45

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

查看更多
Animai°情兽
6楼-- · 2019-07-05 10:47

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?

查看更多
登录 后发表回答