我正在研究asp.net MVC 4应用程序。我的主视图上有一个动作链接,如下所示:
@Ajax.ActionLink("Get LinkedIn Profile","LinkedIn", new AjaxOptions
{
UpdateTargetId="partialDiv", // <-- DOM element ID to update
InsertionMode = InsertionMode.Replace, // <-- Replace the content of DOM element
HttpMethod = "GET" // <-- HTTP method
})
<div id="partialDiv"></div>
并且在控制器中,我有动作结果,它执行重定向到linkedIn并返回到另一个动作结果。
public ActionResult LinkedIn()
{
return Redirect("https://www.linkedin.com/uas/oauth2/authorization?response_type=code&redirect_uri=" + HttpUtility.HtmlEncode("http://127.0.0.1:81/Account/LinkedInAuthorized"));
}
现在来自LinkedInAuthorized我想返回一个部分视图或一些应该插入partialDiv的内容,所以我这样做:
public ActionResult LinkedInAuthorized(string code, string state)
{
// some code here
return PartialView("LinkedInProfileInfo", returnVal);
}
但它取代了整个视图,而不是在该div中插入局部视图。
请建议我解决此问题。
答案 0 :(得分:2)
您需要退后一步,重新评估您正在尝试做的事情。对AJAX和OAuth进行更多的研究也没有什么坏处,因为你显然不太熟悉这些概念。
首先,让我们从OAuth流程开始。首先,您需要将用户定向到提供商的页面,在本例中为LinkedIn。在那里,用户将与提供商进行授权,然后提供商将使用有效负载回发到您站点上的指定页面。您的应用程序解密该有效负载,存储任何相关详细信息,例如在以后的请求中使用的身份验证令牌,然后该过程完成。这不能通过AJAX完成。拥有身份验证令牌后,您可以使用AJAX执行任何操作,但初始授权是同步的。
现在,你的AJAX。 AJAX可以被认为是一个简单的HTTP客户端。您的浏览器也是HTTP客户端,但更复杂。无论在幕后涉及多少请求,这种复杂性的一部分在于提供无缝的用户体验。然而,AJAX处理一个简单的请求 - 响应周期。现在,让我们看看为什么这是一个重要的区别。
请求LinkedIn
行动的浏览器
GET /url/to/linkedin/action
> HTTP/1.1 302
> Location: https://www.linkedin.com/uas/oauth2/authorization...
GET https://www.linkedin.com/uas/oauth2/authorization...
> HTTP/1.1 200
> (crap ton of HTML)
AJAX请求LinkedIn
操作:
GET /url/to/linkedin/action
> HTTP/1.1 302
> Location: https://www.linkedin.com/uas/oauth2/authorization...
请参阅,浏览器知道由于您的原始网址已被重定向,您可能希望真正去那里,因此它会发出另一个重定向网址请求。 AJAX没有做出这样的假设。它发送了请求并得到了回复,所以就完成了。您可以发出另一个AJAX请求来继续。因此,即使您可以使用AJAX进行OAuth授权,也不能这样做。
答案 1 :(得分:0)
尝试在partialDiv中使用Html.RenderPartial。像这样:
<div id="partialDiv">
@{ Html.RenderPartial("LinkedInProfileInfo", returnVal); }
</div>
returnVal可能不是那里的正确值。它也可能是模型(抱歉,我是MVC的新手)。