情景:
User
类有几组属性:password
,address
,preference
,roles
。
我们需要不同的Ajax调用来更新(1)用户密码,(2)用户配置文件,(3)用户所在的角色。
所有教程和示例仅显示一个POST操作来更新整个User类。我的问题是我们如何只更新课程的一部分。
例如,在更新用户密码时,我们将:
一个解决方案:(最容易想到的)
GET
操作以检索用户的所有数据POST
操作,其中包含User类中的所有属性。POST
操作将在不知道密码更改的情况下更新整个数据。好处:POST
只需要执行ApiController
次操作。
缺点:我们需要两次Ajax。
那么,我们是否可以在一个POST
中执行多个ApiController
操作?例如,PostPassword(userId, password)
,PostProfile(userId, profile)
和PostRoles(userId, roles)
。
这样,我们只会致电PostPassword
将密码发送至ApiController
。在客户端,只有一个Ajax调用。它位于我们将进行更新的服务器上。当然,好处是通过互联网传输的数据减少了。
如果可能,将所有不同的POST
来电引导到ApiController
中的相应操作的正确方法是什么?
请帮助我们。谢谢大家。
答案 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(...),...