2011-01-02 11 views
0

Ich benutze eine Teilansicht, um die Benutzer die Gesamtzahl der Elemente, die sie in meiner Anwendung haben, zu rendern. Ich habe dies zur Zeit auf meiner Masterseite:SDK-Äquivalent für Html.Action

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

In meiner Heimat Controller ich habe diese Aktion Methode:

 

[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(); 
} 
 

Das Problem ist, dass app.Session null ist, obwohl vor dem Laden Seite I Url.CanvasAction so meine uRL im Browser verwende sieht wie folgt aus:

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

ich thou ght, dass die Benutzersitzung beibehalten wurde, solange ich innerhalb der Facebook-Domain bleibe (d. h. apps.facebook.com) ...?

Ich verwendete Html.Action vor, aber seit der Installation der neuesten Version des SDK (v 4.1.1) funktioniert es nicht mehr ... hat sich etwas in der neuesten Version geändert, um zu verhindern, dass Html.Action jetzt funktioniert? ??

Gibt es ein Äquivalent zu Html.Action zum Beispiel Html.CanvasAction, das ich zum Rendern von Teilansichten verwenden kann? (Natürlich gibt es nicht einen dort ...)

Grüße, Rob

Antwort

0

Es gibt ein paar Klassen im Facebook.Web.Mvc Projekt, das Erweiterungsmethoden der Htmlhelper, UrlHelper hinzufügen und Steuerung Klassen. Sie finden Erweiterungen wie:

Html.CanvasAction Url.CanvasAction this.CanvasRedirect (in der Steuerung ist es eine Erweiterung, so dass Sie ‚dies‘ verwenden) alle die gleichen Überlastungen

Wir behandelt haben die für jede der Methoden mit dem MVC-Framework bereitgestellt werden.

+0

Hallo Nathan, Die einzigen Klassen, die ich habe, sind CanvasLinkExtensions.cs und CanvasUrlExtensions.cs gefunden, dass jede Ähnlichkeit mit ASP.Net des Html.Action Methode geben. Sprechen wir über das Gleiche hier, Nathan? Sie wissen natürlich, dass Html.Action ein vorgerenderter Prozess für Teiltöne ist, richtig? Nicht nur ein Link Generator ... Ich habe alle Klassen in allen Projekten gesucht und ich denke, Sie haben das Äquivalent zu Html.Action, d. H. Html.CanvasAction vergessen. Bitte beraten ... –

+0

Html.Action ist das Äquivalent in Asp.Net Webforms zu einem User Control übrigens :-) –

0

Rein zufällig habe ich gepackt, wie das SDK funktioniert!

Eine Randnotiz an die Entwickler des SDK, Sie haben einen wunderbaren Job gemacht, aber versuchen Sie, die Dinge ein bisschen besser zu erklären ... Verwenden Sie Bilder und Datenflüsse, damit die Leute Ihre wunderbare SDK viel schneller nutzen können !

Wenn in Ihren Facebook-Einstellungen Sie haben diese Einstellung aktiviert:

  • Beitrag Leinwand

Gemäß der Dokumentation heißt es, dass Facebook wird die Sitzungsdaten und andere Informationen zu Ihrem Ende- veröffentlichen als Formularfelder zeigen. z.B.

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

, was sie nicht sagen, ist, dass dies nur funktioniert, wenn Sie in ihrer Domäne, das heißt:

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

es nichts außerhalb ihrer Domain e veröffentlichen wird.g:

http://www.<yourAppNameHere>.com

Sie vielleicht jetzt denken, gut dah! Aber warte, es gibt mehr!

Wenn Sie wie ich und Sie Asp.Net MVC mit Iframe Canvas als Ihre Anwendung Einstellungen innerhalb von Facebook aktiviert, wenn Sie versuchen und Hilfsmethoden für das Rendern partieller Seiten (effektiv Benutzer-Steuerelemente in Webforms) verwenden und Sie dies auf Ihre Seite ein:

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

Leider gibt es in der MyItemsTotal Aktionsmethode in den Home-Controller, den Sie nicht auf den Sitzungsdaten empfangen werden. Warum fragen Sie ..., weil Asp.Net MVC eine Get-Anfrage verwendet?

Und daher sind Ihre Sitzungsdaten in diesem Kontext nicht mehr vorhanden. Sie rufen effektiv Ihre eigene Domain an.

In meiner Situation bin ich wollte nur die Benutzer-ID abzurufen, so konnte ich stattdessen so etwas tun:

<% = Html.Action ("MyItemsTotal", "Home", neue Routevaluedictionary {{ „UserID ", FbApp.Session.UserId}})%>

Und das bei der Rückkehr abfragen.

Der bessere Ansatz wäre, eine Sitzungshelfer-Klasse zu verwenden, um die Benutzersitzung zu verwalten, von der FacebookApp erbt. In jeder Hinsicht kann ich es einfach so verwenden, wie ich es möchte, und es ist intelligent genug, um die aktuellen Benutzerinformationen in jedem Kontext zu speichern und verfügbar zu machen. Es stellt sich dann die Frage, was ist mit den Benutzern, die Ihre Seite von außerhalb von Facebook betreten, wie wird die neue FacebookApp-Klasse das ermitteln?

Meine Antwort darauf ist, dass es nicht wissen muss, welche Domäne es wirklich aufruft, es muss nur wissen, dass es in einer bestimmten Zeit ablaufen wird, wenn es nicht verwendet wird. Um die Integrität zu wahren, müsste man also die Session-ID oder den eindeutigen Bezeichner Facebook verwenden, um an die Anwendung zu gelangen.

Einige Denkanstösse :-P

Verwandte Themen