将数据从Controller传递到View并返回Controller

时间:2009-06-23 15:36:00

标签: asp.net asp.net-mvc

我正在尝试建立一个邀请系统,如果我的解决方案对我自己看起来很奇怪 有些事情是错的。

用户调用邀请的网址

  

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操作 知道我应该采取哪些不同的做法?

3 个答案:

答案 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是一个很好的写作。它基本上是一次性会话机制。