这似乎不可能,但无论如何我会问。 这是方案
我有一个MVC 3视图,可以加载3个部分视图,一个用于登录,一个用于注册,一个用于OpenID登录。
然而,前两个与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的帐户。如果我不这样做,我想向用户提供一些基本问题等部分视图..并让他们添加开放ID帐户。
所以似乎这是不可能的,因为重定向会导致将数据恢复到原始页面的任何机会。
有什么想法吗?
按要求处理项目符号:
我想在登录表单所在的原始div中找到未找到用户的视图ID。这不起作用。
答案 0 :(得分:1)
整页重定向会破坏原始页面,所以不会,您无法进行后续重定向,只需更新一个<DIV>
即可将用户带回原始页面。
您至少有两种选择:
只需完整页面重定向,当身份验证结果从提供程序返回时,您的MVC控制器将重新呈现整个原始页面。缺点:控制器无法从之前的其他视图中恢复任何特定于用户的状态。
使用弹出窗口记录用户,当登录完成时弹出窗口自行关闭,将身份验证数据传回父页面,然后可以重新呈现它想要的任何部分。
DotNetOpenAuth支持这两种方法,但当然,在库外部的控制器和视图中有大量代码需要编写。我有一个样本,演示了一个相对优雅的#2实现。它位于http://openidux.dotnetopenauth.net/,但该网站现在似乎已关闭。但您可以在此处查看屏幕截图并下载项目模板:http://visualstudiogallery.msdn.microsoft.com/81153747-70d7-477b-b85a-0374e7edabef
答案 1 :(得分:0)
您可以将数据存储在会话中,使用缓存或使用TempData。 缓存当然会自行清除,因此无需维护。
TempData将在读取后自行清除。因此,即使不将其存储在数据库中,您也可以再次访问此数据。