【问题标题】:ASP.NET MVC: How to handle cross-action TempData and ViewDataASP.NET MVC:如何处理交叉操作 TempData 和 ViewData
【发布时间】:2010-10-30 22:01:30
【问题描述】:

我正在尝试找到一种处理以下情况的好方法(我对此还是有点陌生​​):

用户可以使用 RPX/OpenId 提供程序通过我的网站进行注册。

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

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

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

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

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

例如,我想象一个过滤器属性会将 TempData(如果有)合并到 ViewData - 但是我如何将我的数据持久化到未来对同一操作的调用中?再次将其放入 TempData 中?如果我检测到重定向清空 TempData?

谢谢

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      我也遇到过同样的问题,但处理方式略有不同 - 我使用了仅适用于 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.Add ,因为该集合已经包含密钥。所以我创建了自己的扩展方法来重新添加密钥。
      猜你喜欢
      • 2011-12-21
      • 2019-02-03
      • 1970-01-01
      • 1970-01-01
      • 2010-09-15
      • 2011-07-07
      • 1970-01-01
      • 1970-01-01
      • 2010-10-02
      相关资源
      最近更新 更多