0

场景:

一个User类有几组属性:password, address, preference, roles.

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

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

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

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

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

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

好处:POST对于ApiController.

缺点:我们要Ajax两次。

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

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

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

请帮助我们。谢谢你们。

4

2 回答 2

2

我认为,在大多数情况下,无需进行多次发布操作。典型案例是消费者需要编辑用户。因此,她/他需要先加载用户数据以显示在编辑表单上。编辑完成后,消费者可以点击保存按钮提交数据并在 api 控制器上调用 POST 操作。

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

于 2012-08-02T18:01:46.087 回答
1

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(...), ...

于 2012-08-02T17:41:54.423 回答