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!
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;
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.
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?
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
You can resolve this by using attributes [HttpGet] and [HttpPost]. Applying those attributes will tell what method should be invoked for particular request type.