SDK-эквивалент для Html.Action - PullRequest
0 голосов
/ 02 января 2011

Я использую частичное представление для отображения общего количества элементов в моем приложении. В настоящее время у меня есть это на моей главной странице:

<%= Html.Action("MyItemsTotal", "Home") %>

В моем домашнем контроллере у меня есть этот метод действия:


[ChildActionOnly]
public ActionResult MyItemsTotal()
{
    FacebookApp app = new FacebookApp();
    ViewData["count"] = "0";
    int count = 0;

    if (app.Session != null)
        count = (from i in db.Items
                    where i.UserID == app.Session.UserId &&
                    i.Status != "D"
                    select i).Count();

    if (count > 0)
        ViewData["count"] = count.ToString("#,#");

    return PartialView();
}

Проблема в том, что app.Session является нулевым, хотя перед загрузкой страницы я использую Url.CanvasAction, поэтому мой URL в браузере выглядит так:

http://apps.facebook.com/mysite/Home

Я думал, что сеанс пользователей сохраняется до тех пор, пока я остаюсь в домене facebook (т.е. apps.facebook.com) ...?

Раньше я использовал Html.Action, но после установки последней версии SDK (v 4.1.1) он больше не работает ... Что-то изменилось в последней версии, чтобы Html.Action теперь не работал ??

Есть ли эквивалент Html.Action, например Html.CanvasAction, который я могу использовать для рендеринга частичных представлений? (Очевидно, там никого нет ...)

С уважением, Rob

Ответы [ 2 ]

0 голосов
/ 07 января 2011

Совершенно случайно, я думаю, что я ухмыльнулся, как работает SDK!

Примечание для разработчиков SDK: вы проделали замечательную работу, но попробуйте объяснить вещи немного лучше ...Используйте изображения и потоки данных, чтобы люди могли быстрее использовать ваш замечательный SDK!

Если в настройках Facebook у вас включен этот параметр:

  • Публиковать на холсте

Согласно документации говорится, что Facebook будет публиковать данные сеанса и другую информацию в вашей конечной точке в виде полей формы.например,

<input "signed-request" value="...

они не говорят, что это работает только тогда, когда вы находитесь в их домене, то есть:

http://apps.facebook.com/<yourAppNameHere>

он не будет публиковать что-либо за пределами своего домена, например:

http://www.<yourAppNameHere>.com

Теперь вы можете подумать, ну да!Но подождите, это еще не все!

Если вам нравятся я и вы используете Asp.Net MVC с включенным Iframe Canvas в качестве настроек приложения в Facebook, тогда при попытке использовать вспомогательные методы для рендеринга частичных страниц (эффективно пользовательские элементы управления)в веб-формах), и вы включаете это на своей странице:

<% = Html.Action ("MyItemsTotal", "Home")%>

К сожалению, в методе действия MyItemsTotal в контроллере Homeвы не получите данные сеанса.Почему вы спрашиваете ... потому что Asp.Net MVC использует запрос Get!

И, следовательно, ваши данные сеанса больше не существуют в этом контексте.Вы фактически звоните своему собственному домену.

В моей ситуации я только хочу получить userId, поэтому я мог бы сделать что-то вроде этого:

<% = Html.Action ("MyItemsTotal", "Home", новый RouteValueDictionary {{"UserID", FbApp.Session.UserId}})%>

И запросить это при возврате.

Лучшим подходом будет использование сеансавспомогательный класс для поддержки сеанса пользователей, от которого наследуется FacebookApp.Для любых целей и задач я могу использовать его любым удобным для меня способом, и он достаточно умен, чтобы хранить и раскрывать информацию о текущих пользователях в любом контексте.Тогда возникает вопрос: а как насчет пользователей, заходящих на ваш сайт за пределами Facebook, как новый класс FacebookApp определит это?

Мой ответ на этот вопрос заключается в том, что ему не нужно знать, какой домен его вызывает.на самом деле, ему просто нужно знать, что срок его действия истекает через определенное время, если он не используется.Чтобы сохранить целостность и, в-четвертых, нужно использовать идентификатор сеанса или какой-либо уникальный идентификатор facebook, передаваемый приложению.

Пища для размышлений: -P

0 голосов
/ 04 января 2011

В проекте Facebook.Web.Mvc есть несколько классов, которые добавляют методы расширения к классам HtmlHelper, UrlHelper и Controller.Вы найдете такие расширения, как:

Html.CanvasAction Url.CanvasAction this.CanvasRedirect (в контроллере это расширение, поэтому вы должны использовать «this»)те же перегрузки, которые предоставляются в MVC Framework для каждого из методов.

...