ASP.NET MVC:如何处理交叉操作TempData和ViewData

时间:2009-06-03 07:15:17

标签: c# asp.net-mvc viewdata tempdata

我正在努力寻找一种处理以下场景的好方法(我还是有点新手):

用户可以使用RPX / OpenId提供商在我的网站上注册。

步骤1:用户通过提供商进行身份验证。提供程序将一个临时标记返回给我的一个操作方法。

步骤2:我使用令牌获取用户的个人资料信息并加载一个视图,允许他们输入任何缺少的必填字段和可选字段。

我在步骤2中使用了2个操作方法:一个用于处理使用令牌获取信息。第二个操作,它获取授权信息并加载缺失/可选字段视图。

我通过TempData将授权信息传递给第二个动作。第二个动作可以处理验证,因此我有可能需要保留授权对象,而不仅仅是1个请求。我无法使用令牌重新生成授权信息,因为它在技术上是一次性使用令牌,因为它使用网络资源而重新生成请求会很愚蠢。

如何将对象保留在TempData中以用于对同一操作的任何后续请求,但是删除任何重定向的对象?因为在我的应用程序中这可能是一个可重复的模式,我应该创建一个Filter来自动处理这种情况吗?

例如,我想象一个过滤器属性,它将TempData(如果有的话)合并到ViewData中 - 但是我如何将我的数据保存到将来对同一个动作的调用中呢?再把它扔进TempData?如果我检测到重定向是空的TempData?

由于

2 个答案:

答案 0 :(得分:3)

如果有必要,我最终会将数据重新添加到TempData。由于TempData不允许您添加重复键,因此我创建了自己的帮助方法来删除然后重新添加键:

public static void AddNew(this TempDataDictionary tempData, string key, object obj)
{
    if ( tempData.ContainsKey( key ) ) tempData.Remove( key );

    tempData.Add( key, obj );
}

答案 1 :(得分:1)

我遇到了同样的问题,但是采用了稍微不同的方式 - 我使用了一种仅使用OpenID的Forms身份验证方法...如果我的提供商返回Authenticated,我会执行以下操作

                var fields = openid.Response.GetExtension(typeof(ClaimsResponse)) as ClaimsResponse;

                if (fields != null)
                {
                    TempData["Email"] = fields.Email;
                    TempData["Nickname"] = fields.Nickname;
                }

                FormsAuthentication.RedirectFromLoginPage(openid.Response.ClaimedIdentifier, false);

                break;

这意味着我不需要传递任何类型的身份验证令牌 - 在执行此代码后,我知道我的用户已经过身份验证。

因此,此控制传递的操作将简单地将TempData字段(如果已填充)复制到ViewData中并将它们传递到视图上。

在此之后处理验证 - 我不关心从OpenID返回的内容(即它是否有效),我让用户编辑它然后保存,然后执行我的验证。