2009-06-23 205 views
3

我試圖做一個邀請系統,如果我的解決方案看起來很奇怪,即使對我自己 有些事情是錯的。將數據從控制器傳遞到視圖並返回到控制器

用戶呼叫服務的URL的邀請

site.com/Account/Invitation/invitationGUID

public ActionResult Invitation(Guid invitationGUID) 
{ 
    //Check for the existence of the invitation id 
    if(true) 
     return RedirectToAction("Account","Register") 
    return View("InvalidInvite"); 
} 

我需要的invitationGUID傳遞給註冊行動

public ActionResult Register() 
{ 
    //this is the registration form 
    return View(); 
} 

而我仍然需要該帖子的invitationGUID,以保存此信息

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Register(string email, string password, string confirmPassword, 
           string firstName, string lastName, string cep) 
{ 
    //register user 
    return View(); 
} 

我應該怎麼做來傳遞這些信息?
我想邀請人來傳送數據 - >註冊

return RedirectToAction("Account","Register",invitationGUID) 

調用註冊查看與invitationGUID

return View("Register",invitationGUID); 

,並在註冊查看使用隱藏的輸入拿回來用POST來註冊

<%= Html.Hidden("invitationGUID",(Guid)Model %> 

它看起來太和我的口味交織在一起了,我可能會打破許多良好的實踐查看/控制器隔離。
我是否應該在邀請函中複製註冊碼?
我現在傾向於在邀請POST中複製Register POST操作。
任何想法我應該做什麼不同?

+0

如果您在下面的答案中需要更多解釋,請告訴我。 – 2009-06-23 16:06:03

回答

1

我不知道你打破任何最佳做法。退後一步,想想你想做什麼。您希望有一個公開邀請的用戶可以註冊。

發佈註冊的用戶必須提供其inviteID。所以,註冊操作必須通過一個邀請ID。你有這個。

如果您希望用戶使用瀏覽器作爲他們的客戶端進行註冊 - 他們需要獲得允許他們註冊的表單。你可能不希望他們輸入他們的邀請ID - 所以應該爲他們填寫。因此,您的註冊視圖需要被賦予一個邀請ID來表示屬性。你有這個。

我可能會建議的唯一方法是跳過整個邀請操作。它並不是真的需要。相反,只需在註冊操作中進行錯誤檢查即可。

很適合在重定向時傳遞所需的路由數據。如果你不能用一些數據來解決路線問題,那麼你會怎麼做呢?在這種情況下,路由依賴於inviteId(因爲它需要呈現表單)。通過它,並開心:)

所以,總結。你在做什麼並不是那麼複雜。想想每一步,就好像你對其他人一無所知。另外,我建議具有用戶HTTP GET,看起來像這樣的路線:

site.com/Account/Register/invitationGUID 

site.com/Account/Register?invite=invitationGUID 

上面之間的選擇取決於你是否希望有明確的邀請ID在該動作的簽名(並要求它解決路由),或者如果您想查看動作中的QueryString。我可能會傾向於查詢字符串,因爲邀請並不是被修改的實體 - 它允許創建用戶實體的網關。沒有邀請身份的用戶最好也可以在這個動作中結束。

+0

邀請的邏輯非常簡單,無視邀請行爲可能是最好的選擇。謝謝。 – 2009-06-23 17:52:57

1
return RedirectToAction("Account", "Register", new { invitation = invitationGUID }); 

invitationGUID將查詢字符串的一部分:)

public ActionResult Register(Guid invitation) 
{ 
    //this is the registration form 
    return View(); 
} 

使用Html.BeginForm(這將被張貼到自身:

<% using (Html.BeginForm()) { %> 
... 
<% } %> 

invitationGUID仍然在查詢字符串:

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Register(string email, string password, string confirmPassword, 
    string firstName, string lastName, string cep, Guid invitation) 
{ 
    //register user 
    return View(); 
} 
0

如果您不想要查詢字符串中的邀請ID,則可以使用TempData。 Here是一個很好的寫在它。這基本上是一次性會話機制。

+0

不知道TempData,當你知道中間不會有AJAX請求時聽起來不錯。 – 2009-06-23 17:36:24

相關問題