我可以为ApiController进行多个POST操作吗?

时间:2012-08-02 17:39:54

标签: ajax rest asp.net-mvc-4 asp.net-web-api

情景:

User类有几组属性:passwordaddresspreferenceroles

我们需要不同的Ajax调用来更新(1)用户密码,(2)用户配置文件,(3)用户所在的角色。

所有教程和示例仅显示一个POST操作来更新整个User类。我的问题是我们如何只更新课程的一部分。

例如,在更新用户密码时,我们将:

  1. 显示一个文本框,以便从用户输入中收集新密码。
  2. 进行Ajax调用,只将新密码和userId(例如:{id = 3,newPassword = xxxxx})一起发送到WebAPI POST操作。
  3. 该操作只会更新用户的密码。
  4. 一个解决方案:(最容易想到的)

    1. 使用userId调用GET操作以检索用户的所有数据
    2. 使用从Web用户输入
    3. 获取的值更新用户数据中的密码
    4. 使用更新的数据调用POST操作,其中包含User类中的所有属性。
    5. POST操作将在不知道密码更改的情况下更新整个数据。
    6. 好处:POST只需要执行ApiController次操作。

      缺点:我们需要两次Ajax。

      那么,我们是否可以在一个POST中执行多个ApiController操作?例如,PostPassword(userId, password)PostProfile(userId, profile)PostRoles(userId, roles)

      这样,我们只会致电PostPassword将密码发送至ApiController。在客户端,只有一个Ajax调用。它位于我们将进行更新的服务器上。当然,好处是通过互联网传输的数据减少了。

      如果可能,将所有不同的POST来电引导到ApiController中的相应操作的正确方法是什么?

      请帮助我们。谢谢大家。

2 个答案:

答案 0 :(得分:2)

我认为,大多数情况下,不必进行muptile post动作。典型的情况是消费者需要编辑用户。因此,他/她需要首先加载用户数据以在编辑表单上显示。编辑完成后,消费者可以单击“保存”按钮提交数据并在api控制器上调用POST操作。

如果您的情况不同,您应该为值类型设置nullable属性,然后应该在控制器中检查的逻辑是否任何属性为null,它不应该将此属性更新为数据库。

答案 1 :(得分:1)

每个控制器操作名称只能有一个帖子操作。也就是说,你做不到

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

但是,动作的参数当然可以为空。如果给定HTTP请求中未提供给定属性,则控制器中属性的值将为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
}

或者,您可以拥有相关的控制器操作,每个操作都处理您的一个用例,例如: UpdatePassword(...),UpdateAddress(...),...