2014-01-31 3 views
0

Я работаю над приложением 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 Я хочу вернуть PartialView или некоторые содержимое, которое должно быть вставленным в partialDiv, поэтому я делаю так:

public ActionResult LinkedInAuthorized(string code, string state) 
     { 
     // some code here 
     return PartialView("LinkedInProfileInfo", returnVal); 
     } 

Но он заменяет целое представление вместо вставки частичного вида в этом div.

Пожалуйста, предложите мне решение этого вопроса.

+1

убедитесь, что у вас есть ссылка на ajax.unobtrusive на ваш взгляд –

+0

@MattBodily Можем ли мы сделать частичный просмотр, не делая вызов ajax, поскольку в моем случае это не вызов ajax. – DotnetSparrow

+0

Это не ваш типичный вызов ajax, но ваша ссылка имеет параметры ajax, поэтому он делает вызов ajax. Это перенаправление вместо заполнения div из-за отсутствия ссылки –

ответ

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... 

Престола, браузер знает, что, так как ваш оригинальный URL был перенаправлен, вы, вероятно, хотите на самом деле туда, поэтому он выдает другой запрос на перенаправленный URL. AJAX не делает таких предположений. Он отправил запрос и получил ответ, так что все сделано. Вам решать выпустить другой запрос AJAX. Итак, даже если вы можете использовать, использовать AJAX для авторизации OAuth, вы не могли бы этого сделать.

+0

Спасибо за очень хорошее объяснение. Как я могу использовать json, возвращенный результатом второго действия LinkedInAuthorized и обновить div вида? – DotnetSparrow

0

Попробуйте использовать Html.RenderPartial внутри partialDiv. Например:

<div id="partialDiv"> 
    @{ Html.RenderPartial("LinkedInProfileInfo", returnVal); } 
</div> 

returnVal может отличаться от него. Это также может быть модель (извините, что я новичок в MVC).

Смежные вопросы