场景:
User
类具有多组属性:password
、address
、preference
、roles
。
我们需要不同的Ajax调用来更新(1)用户密码,(2)用户配置文件,(3)用户所处的角色
所有的教程和示例只显示了一个POST操作来更新整个User类。我的问题是我们如何只更新部分课程。
例如,在更新用户密码时,我们将:
- 显示一个文本框,从用户输入中收集新密码
- 进行Ajax调用,只将新密码和userId(如:{id=3,newPassword=xxxxx})一起POST到WebAPI POST操作
- 该操作只会更新用户的密码
一个解决方案:(最容易想到的)
- 使用userId调用
GET
操作以检索用户的所有数据 - 使用从web用户输入中获得的值更新用户数据中的密码
- 使用更新的数据调用
POST
操作,其中包含User类中的所有属性 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(…)…