从控制器传递数据到视图再返回控制器

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");
}

我需要将邀请GUID传递给注册操作。
public ActionResult Register()
{
    //this is the registration form
    return View();
}

我仍然需要在提交时获得邀请GUID,以保存这个信息。

[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)

使用邀请GUID调用注册视图

return View("Register",invitationGUID);

在注册页面使用隐藏的输入框,并通过POST方法将其传回注册页面。
<%= Html.Hidden("invitationGUID",(Guid)Model %>

我觉得这个代码太复杂了,而且可能违反了关于视图/控制器隔离的很多好的实践。
那么我应该只是在邀请页面复制注册页面的代码吗?
现在我倾向于只是复制注册POST操作到邀请POST中。
你有什么不同的想法吗?


如果您需要我以下回答的更多澄清,请告诉我。 - Dane O'Connor
3个回答

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

我认为你没有违反任何最佳实践。退一步,考虑一下你想做什么。你想让一个有开放邀请的用户能够注册。

发布注册的用户必须提供他们的邀请ID。因此,注册操作必须传递一个邀请ID。你已经有了这个。

如果你希望你的用户使用浏览器作为客户端进行注册 - 他们需要被给予一个表单来允许他们进行注册。你可能不希望他们输入他们的邀请ID - 所以这应该为他们填写。因此,你的注册视图需要被赋予一个邀请ID来正确呈现表单。你已经有了这个。

我唯一建议的是跳过整个邀请操作。它并不是真正需要的。相反,在注册操作中进行错误检查即可。

在重定向时传递所需的路由数据是可以的。如果你不能解析一个路由而没有一些数据,那么你还能怎么做呢?在这种情况下,路由取决于邀请ID(因为它需要呈现表单)。传递它并感到高兴 :)

因此,总之。你正在做的事情并不复杂。把每一步都当作你对其他步骤一无所知。此外,我建议用户使用类似于这样的HTTP GET路由:

site.com/Account/Register/invitationGUID

或者

site.com/Account/Register?invite=invitationGUID

以上选择取决于您是否希望在操作的签名中明确包含邀请ID(并要求解析路由),或者您是否希望从操作内查看查询字符串。在这种情况下,我可能会倾向于使用查询字符串,因为邀请不是此处被修改的实体 - 它是允许创建用户实体的网关。没有邀请ID的用户也应该以这种方式结束。

邀请的逻辑非常简单,忽略邀请操作可能是最好的选择。谢谢。 - Tadeu Maia

0

如果您不想在查询字符串中使用邀请ID,可以使用TempData。这里有一个很好的介绍。它基本上是一种一次性会话机制。


不知道TempData,当你知道中间不会有AJAX请求时,听起来很不错。 - Tadeu Maia

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接