Blaise
Blaise

Reputation: 22232

Can I have multiple POST actions for an ApiController?

The scenario:

a User class has several groups of properties: password, address, preference, roles.

We need different Ajax calls to update the (1) user password, (2) user profile, (3) roles a user is in.

All the tutorials and examples only shows one POST action to update the whole User class. My question is how we can update only part of the class.

For example, when updating the user password, we will:

  1. Display a text box to collect new password from user input.
  2. Make an Ajax call that only POST the new password together with the userId (like: {id=3, newPassword=xxxxx}) to the WebAPI POST action.
  3. That action will only update the password for the user.

One solution: (the easiest to think of)

  1. Call the GET action with the userId to retrieve all the data for a user
  2. Update the password in the user data with the values obtained from the web user input
  3. Call the POST action with the updated data, which contains all properties in the User class.
  4. That POST action will update the whole data without knowing only the password is changed.

The benefit: only one POST action is needed for the ApiController.

The shortcoming: we have to Ajax twice.

So, is it possible that we can have multiple POST actions in one ApiController? For example, PostPassword(userId, password), PostProfile(userId, profile) and PostRoles(userId, roles).

In this way, we will only call PostPassword to send the password to ApiController. In client side, there will be only one Ajax call. It is on the server where we will do the update. The benefit is of course the reduced data transferred over Internet.

If it is possible, what is the correct way to direct all different POST calls to their corresponding actions in the ApiController?

Please help us. Thank you all.

Upvotes: 0

Views: 450

Answers (2)

cuongle
cuongle

Reputation: 75316

Most of cases, needless to have muptile post actions, I think. The typical case is consumer needs to edit user. So, s/he needs to load user data first to show on the edit form. After editing, consumer can click Save button to submit data and call POST action on api controller.

If your case is different, you should have nullable property for value type, and then the logic which should be checked in controller is if any property is null, it should not update this property into database.

Upvotes: 2

Eric J.
Eric J.

Reputation: 150148

You can only have one post action per controller action name. That is, you cannot do

// NOT VALID:
public ActionResult UpdateUser(string newPassword) { }
public ActionResult UpdateUser(List<string> newRoles) { }

However, parameters of the action can certainly be nullable. If a given property is not supplied in a given HTTP request, the value of the property in the controller would be null.

// VALID:
public ActionResult UpdateUser(string newPassword, List<string> newRoles) 
{ 
    if (newPassword != null) { } // It must have been supplied
    if (newRoles != null) { } // It must have been supplied
}

Alternatively, you can have related controller actions that each handle one of your use cases, e.g. UpdatePassword(...), UpdateAddress(...), ...

Upvotes: 1

Related Questions