2009-06-23 202 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

相关问题