我正在尝试建立一个邀请系统,如果我的解决方案对我自己看起来很奇怪 有些事情是错的。
用户调用邀请的网址
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传递给Register操作
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
调用Register视图return View("Register",invitationGUID);
使用注册视图中的隐藏输入将其恢复为使用POST注册
<%= Html.Hidden("invitationGUID",(Guid)Model %>
它看起来与我的品味交织在一起,而且我可能在观察/控制器隔离方面打破了很多好的做法。
我应该在邀请时复制注册码吗?
我现在正倾向于在邀请POST处复制Register POST操作
知道我应该采取哪些不同的做法?
答案 0 :(得分: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();
}
答案 1 :(得分:1)
我认为你没有打破任何最佳做法。退后一步,想想你想做什么。您希望具有开放邀请的用户能够注册。
发布注册的用户必须提供其inviteID。因此,必须将Register操作传递给inviteID。你有这个。
如果您希望您的用户使用浏览器作为他们的客户端进行注册 - 他们需要获得一个允许他们注册的表单。你可能不希望他们输入他们的inviteIDs - 所以这应该填写它们。因此,您的寄存器视图需要被赋予一个来自属性的inviteID来呈现表单。你有这个。
我唯一可能建议的是跳过整个邀请行动。它并不是真的需要。而只是在Register操作中进行错误检查。
当您重定向时,可以传递所需的路径数据。如果你无法解决没有某些数据的路线,那你还会怎么做呢?在这种情况下,路由依赖于inviteId(因为它需要呈现表单)。通过并开心:)
总而言之。你所做的并不是那么令人费解。想想每一步,就好像你对其他步骤一无所知。另外,我建议让用户HTTP GET看起来像这样的路线:
site.com/Account/Register/invitationGUID
或
site.com/Account/Register?invite=invitationGUID
上述选择取决于您是否要在操作的签名中明确拥有邀请ID(并且需要它来解析路径),或者您是否希望从操作中查看QueryString。我可能倾向于在这一个上查询字符串,因为邀请不是这里被更改的实体 - 它是允许创建用户实体的网关。没有inviteID的用户也可能最终也会采取此行动。
答案 2 :(得分:0)
如果您不想在查询字符串中使用邀请ID,则可以使用TempData。 Here是一个很好的写作。它基本上是一次性会话机制。