2012-08-02 76 views
0

場景:我可以爲ApiController提供多個POST操作嗎?

一個User類具有幾組:passwordaddresspreferenceroles

我們需要不同的Ajax調用來更新(1)用戶密碼,(2)用戶配置文件,(3)角色的用戶在不在。

所有的教程和例子只能說明一個POST操作以更新整個用戶類。我的問題是我們如何只更新班級的一部分。

例如,更新用戶密碼的時候,我們會:

  1. 顯示一個文本框來收集用戶輸入的新密碼。
  2. 創建一個Ajax調用,該調用僅將新密碼與userId一起發佈(如:{id = 3,newPassword = xxxxx})到WebAPI POST操作。
  3. 該操作只會更新用戶的密碼。

一個解決方案:(最容易想到的)

  1. 調用GET動作與用戶id檢索用戶
  2. 更新與值的用戶數據的密碼,所有數據從網絡用戶輸入獲得
  3. 使用更新的數據調用POST操作,該數據包含User類中的所有屬性。
  4. POST動作會更新整個數據而不知道密碼是否改變。

好處:只有一個POST動作需要ApiController

缺點:我們要Ajax兩次。

那麼,我們可以在一個ApiController中有多個POST動作嗎?例如,PostPassword(userId, password),PostProfile(userId, profile)PostRoles(userId, roles)

這樣,我們只會撥打PostPassword將密碼發送到ApiController。在客戶端,只會有一個Ajax調用。它在服務器上,我們將進行更新。當然,通過互聯網傳輸的數據減少了。

如果可能,將所有不同的POST調用指向ApiController中相應的操作的正確方法是什麼?

請幫助我們。謝謝你們。

回答

2

大多數情況下,不用有muptile post操作,我想。典型的情況是消費者需要編輯用戶。所以,他/她需要首先加載用戶數據以顯示在編輯表單上。編輯完成後,用戶可以點擊保存按鈕提交數據並在api控制器上調用POST操作。

如果你的情況不同,你應該有值類型的可空屬性,然後應該在控制器中檢查的邏輯是如果任何屬性爲空,它不應該更新這個屬性到數據庫。

+0

謝謝你的回覆。但可能不需要加載編輯表單的所有用戶數據。假設,如果需要更新他/她的密碼,則只會顯示一個文本框來接受輸入。具有uerId和新密碼的json將足以完成這項工作。那麼,我們如何才能發佈整個用戶數據的一部分並獲得部分更新呢? – Blaise 2012-08-02 18:22:30

+0

隨着你的情況,你只需將密碼POST回服務器,User的其他屬性將爲空。更新數據庫的代碼檢查每個屬性是否爲空,所有屬性不爲null將被更新。 – 2012-08-03 03:56:23

1

每個控制器操作名稱只能有一個發佈操作。也就是說,你不能這樣做

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

但是,動作的參數肯定是可以爲空的。如果給定的HTTP請求中沒有提供給定的屬性,則控制器中的屬性值將爲空。

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

+0

Eric,謝謝你的快速回復。 – Blaise 2012-08-02 17:46:43

+0

什麼是「相關控制器」?它是一個常規的MVC控制器或ApiController? – Blaise 2012-08-02 17:47:22

+0

對不起,我在我的回覆中遺漏了一個讓我感到困惑的詞。已更新,包括示例。 – 2012-08-02 17:54:39

相關問題