2012-01-02 37 views
0

这似乎是不可能的,但我会问无论如何。 这是场景如何在重定向后更新div的内容?

我有一个MVC 3视图加载3个部分视图,一个用于登录,一个用于注册,另一个用于OpenID登录。

然而,前2项与Ajax很好,第三视图使用AJAX张贴到我的OpenID的控制器去哪儿做一些DotNetOpenAuth魔术

例子:

var response = authenticationRequest.RedirectingResponse; 
       if(response.Status == HttpStatusCode.Redirect) 
       { 
        return Json(new {redirectUrl=response.Headers[HttpResponseHeader.Location] });  
       } 

我来自控制器的OpenID登录表单发送到这样做从返回的JSON重定向, “记住这篇文章是通过ajax”。所以在重定向之后,我想用基于重定向到提供程序后发生的事情的新视图替换原始的openid登录部分视图的div内容,用户登录,并在我的actionMethod中获得响应。例如,我将检查我的数据库,看看我是否已经拥有该开放标识的帐户。如果我不想,我想给用户提供一些基本问题的部分视图等,并让他们添加开放的id帐户。

因此,似乎这是不可能的,因为重定向杀死任何获取数据回原始页面的机会。

任何想法?

过程子弹的要求:

  • 主视图呈现与表单
  • 局部视图内表确实AJAX交到ActionMethod在控制器
  • ActionMethod在控制器返回的Json用的局部视图redirectUrl
  • OnSuccess回调函数读取json结果并执行客户端重定向到redirectUrl
  • 用户以重定向方式登录到openid提供程序位置
  • OpenID提供商将结果发送回生成该初始的Json的redirectUrl结果相同ActionMethod
  • 上开放的。ID执行DB查询和在如果发现如果用户没有找到返回局部视图或记录用户。

我想有视图id没有找到用户加载到登录表单所在的原始div中。这是行不通的。

+0

也许子弹点这个有点难以阅读和理解这里发生了什么。也许它只是我,但我只是交叉眼睛:) – 2012-01-02 18:21:52

+0

添加项目符号:) – CrazyCoderz 2012-01-02 18:38:33

+0

事实上,我想这个信息在同一页面上很可能不是功能上最好的方法。我只是想知道这样的事情是否可能。 – CrazyCoderz 2012-01-02 18:44:18

回答

1

整页重定向破坏了原始页面,所以不行,你不能有一个后续的重定向将用户带回原始页面,只更新一个<DIV>

您至少有两种选择:

  1. 干脆把整个页面重定向,并且当认证结果由提供你的MVC控制器回来重新呈现整个原始页面。下行:控制器无法从之前存在的其他视图恢复任何用户特定的状态。

  2. 使用弹出窗口登录用户,当登录完成后,弹出窗口自动关闭,将身份验证数据传回父页面,然后可以重新呈现所需的任何部分。

DotNetOpenAuth同时支持这两种方法,但是当然在控制器和视图中有许多代码需要编写,在库的外部。我确实有一个示例,展示了相对优化的#2实现。这是在http://openidux.dotnetopenauth.net/,但该网站似乎是在现在。但你可以在这里看到一个截图并下载一个项目模板:http://visualstudiogallery.msdn.microsoft.com/81153747-70d7-477b-b85a-0374e7edabef

0

您可以简单地将数据存储在会话中,使用缓存或使用TempData。 缓存当然会清除,所以不需要维护。

TempData在读取后会自行清除。因此,即使没有将其存储在数据库中,您也可以再次访问这些数据。

+0

感谢您的回复先生。我没有收到数据的问题,这更像是一个可用性问题,很可能是因为我不希望将用户发送到单独的视图以添加开放式ID帐户。我永远不希望他们离开最初的登录页面。我知道可能不实际。 – CrazyCoderz 2012-01-02 19:51:00

+0

我将尝试执行重定向回到登录页面,并将呈现为视图的视图存储在TempData中的关联ViewModel数据中。您将您的想法存储在TempData中,让ol大脑受到欢迎。我会很快回复你。也许使用一点Jquery替换TemData视图的现有部分。 – CrazyCoderz 2012-01-02 20:33:18

+0

TempData在我的重定向中遇到了问题,有点像预期的那样,但它确实似乎可以使用cookie。 (TempData.ContainsKey(“AddOpenId”)) – CrazyCoderz 2012-01-02 21:30:41