我可以为一个ApiController执行多个POST操作吗



场景:

User类具有多组属性:passwordaddresspreferenceroles

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

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

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

  1. 显示一个文本框,从用户输入中收集新密码
  2. 进行Ajax调用,只将新密码和userId(如:{id=3,newPassword=xxxxx})一起POST到WebAPI POST操作
  3. 该操作只会更新用户的密码

一个解决方案:(最容易想到的)

  1. 使用userId调用GET操作以检索用户的所有数据
  2. 使用从web用户输入中获得的值更新用户数据中的密码
  3. 使用更新的数据调用POST操作,其中包含User类中的所有属性
  4. POST操作将更新整个数据,而不知道仅更改了密码

优点:ApiController只需要一个POST操作。

缺点:我们不得不去Ajax两次。

那么,我们有可能在一个ApiController中有多个POST动作吗?例如,PostPassword(userId, password)PostProfile(userId, profile)PostRoles(userId, roles)

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

如果可能的话,将所有不同的POST调用引导到它们在ApiController中的相应操作的正确方法是什么?

请帮帮我们。谢谢大家。

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

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

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

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

然而,操作的参数当然可以为null。如果给定的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(…)…

最新更新