C# ASP.NET MVC:如何处理跨动作TempData和ViewData

C# ASP.NET MVC:如何处理跨动作TempData和ViewData,c#,asp.net-mvc,viewdata,tempdata,C#,Asp.net Mvc,Viewdata,Tempdata,我正试图找到一种处理以下场景的好方法(我对这一点还是有点陌生): 用户可以使用RPX/OpenId提供程序通过我的站点注册 步骤1:用户通过提供者进行身份验证。提供程序将临时令牌返回给我的一个操作方法 步骤2:我使用令牌获取用户的配置文件信息并加载一个视图,该视图允许用户输入任何缺少的必填字段和可选字段 我在步骤2中使用了两种操作方法:一种是使用令牌处理信息抓取。第二个操作,获取授权信息并加载缺失/可选字段视图 我正在通过TempData将授权信息传递给第二个操作。第二个操作可以处理验证,因此我

我正试图找到一种处理以下场景的好方法(我对这一点还是有点陌生):

用户可以使用RPX/OpenId提供程序通过我的站点注册

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

步骤2:我使用令牌获取用户的配置文件信息并加载一个视图,该视图允许用户输入任何缺少的必填字段和可选字段

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

我正在通过TempData将授权信息传递给第二个操作。第二个操作可以处理验证,因此我可能需要为不止一个请求保留授权对象。我不能使用令牌来重新生成授权信息,因为从技术上讲,它是一次性令牌,而且重新生成请求是愚蠢的,因为它正在使用网络资源

如何将TempData中的对象持久化以供后续对同一操作的任何请求,但如何删除这些对象以进行任何重定向?既然这在我的应用程序中可能是一种可重复的模式,我应该创建一个过滤器来自动处理这种情况吗

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


谢谢

我也遇到了同样的问题,但处理方法略有不同-我使用了一种表单身份验证方法,该方法仅适用于OpenID。。。如果我的提供者返回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返回的内容(即它是否有效),我让用户编辑此内容,然后保存,然后执行验证。

如果需要,我会将数据重新添加到TempData。由于TempData不允许您添加重复的键,因此我创建了自己的helper方法来删除并重新添加键:

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

    tempData.Add( key, obj );
}

在摆弄了几个小时后,我决定将数据重新添加到TempData中。我发现您无法使用TempData。请重新添加,因为集合已包含密钥。因此,我创建了自己的扩展方法来重新添加密钥。