2009-11-18 87 views
1

以下是這種情況:當新用戶註冊到我們的網站時,我們想發送一封電子郵件來驗證用戶是否擁有該電子郵件地址。在電子郵件中有一個頁面的鏈接,將做驗證,像這樣:ASP.NET MVC:以相同的方法使用GET和POST

http://www.mysite.com/account/verify/token

的驗證方法是這樣的:

[AcceptVerbs(HttpVerbs.Get)] 
public ActionResult Verify(Nullable<Guid> id) 
{ 
    // tries to get the user based on the verification code 
    if (ValidId(id)) 
    { 
     // if the id is correct, update user data in the model and redirect 
     return RedirectToAction("Index", "Dashboard"); 
    } 
    else 
    { 
     // redirects the user to the verify view 
     return View("Verify"); 
    } 
} 

「驗證」視圖是一個簡單的帶有按鈕的文本框,因此用戶可以手動輸入驗證碼(用戶可以從該站點訪問此頁面,並且可能更喜歡只複製粘貼代碼)。當用戶點擊按鈕時,我想要做與我的GET方法一樣的事情;所以我結束了這樣的事情:

[AcceptVerbs(HttpVerbs.Get | HttpVerbs.Post)] 
public ActionResult Verify(Nullable<Guid> id) { ... } 

我有幾個問題與此代碼(其中工程,但...):

  • 是否確定有GET和POST方法?或者有更好的方法來處理這種情況?
  • 我正在修改GET方法中的數據(如果ID是正確的,我更新用戶數據以反映它已經過驗證)並且這是一個很大的否NO ...我仍然希望用戶能夠點擊鏈接並驗證令牌。有沒有更好的方法來實現這一目標?

感謝

+0

__Verrify__視圖可以使用JS從窗體中獲取請求,因此您不會有單獨的操作。沒有? – Amirshk 2009-11-18 02:20:48

回答

1

我個人不會打擾AcceptVerbs屬性。 (**請參閱下面的註釋)然後,您可以將其合併爲一個操作,並根據需要進行響應。 (下面顯示了一些未經測試的代碼。)我添加答案而不僅僅是評論的原因是,我想建議您爲邏輯添加一個分支,以處理失敗的代碼(即提供錯誤消息) 。

public ActionResult Verify(Nullable<Guid> id) 
{ 
    if (!id.HasValue) 
    { 
     // nothing was submitted 
     ViewData["message"] = "Please enter your ID and press Submit"; 
     return View("Verify"); 
    } 
    if (!ValidId(id)) 
    { 
     // something was submitted, but wasn't valid 
     ViewData["message"] = "ID is invalid or incomplete. Pleaes check your speeling"; 
     return View("Verify"); 
    } 
    // must be valid 
    return RedirectToAction("Index", "Dashboard"); 

} 

然後,您當然可以在驗證視圖中顯示<%=ViewData["message"]%>。這當然只是一個簡單的例子。

**好了,這裏是我的筆記RE:不與AcceptVerbs屬性煩心事:
在你的情況,你也可以只選擇使你的窗體的方法GET代替POST。因爲您已經在「採取行動」並修改用戶點擊的便捷鏈接上的狀態,所以我不會看到任何區別。即使我親自選擇我以前的建議,我只是提到這是徹底的。

祝你好運!

+0

謝謝..這似乎是正確的方式..我很高興我沒有離開這裏:) – 2009-11-18 15:16:29

+0

這是一個很好的方法,如果你的控制器很輕,但如果你的控制器變大,那麼它可以成爲一個噩夢,我個人從來沒有使用過這種類型的所有強大的控制器,它聞起來有風險。 – JOBG 2009-11-18 21:04:53

0

我不得不說,這是很少發現有人這麼關心使用正確的HTTP動詞。我不相信HTTP規範的初衷是將所有數據編輯提交限制在POST和所有的GET檢索。我認爲你在做什麼就好。

+0

謝謝..看來我真的很擔心我不需要的地方。我感謝你的時間! – 2009-11-18 15:17:01

1

我在一個GET方法修改數據......這是一個很大的NO NO

我不會說這總是一個很大的不,不。 HTTP表示GET方法「應該」是「安全的」,也就是說除了信息檢索之外,它應該沒有效果。在這種情況下,我認爲將「安全」的定義擴展爲沒有任何有害的副作用是合理的,並且實際上驗證鏈路可能具有的唯一可能的副作用是理想的副作用。

GET方法應該具有的其他屬性是冪等性的:如果用戶多次單擊驗證鏈接,就好像他們只點擊一次一樣。希望您擁有此屬性,因爲驗證鏈接是使用一次性代碼生成的。

+0

yeap ..它是一次性使用代碼..所以我很好。謝謝! – 2009-11-18 15:17:37

-1

如果你擔心它,那麼這有什麼問題?

 [AcceptVerbs(HttpVerbs.Get)] 
    public ActionResult Verify() 
    { 
     return View("Verify"); 
    } 

    [AcceptVerbs(HttpVerbs.Post)] 
    public ActionResult Verify(Guid? id) 
    { 
     if (ValidId(id)) 
     { 
      return RedirectToAction("Index", "Dashboard"); 
     } 

     return View("Verify"); 
    } 
相關問題