用局部视图更新asp.net MVc 4视图的一部分

时间:2014-01-31 17:00:47

标签: jquery asp.net ajax asp.net-mvc asp.net-mvc-4

我正在研究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中插入局部视图。

请建议我解决此问题。

2 个答案:

答案 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的新手)。