SharePointCommunity
Die deutschsprachige Community für SharePoint, Microsoft 365, Teams, Yammer und mit Azure

Sponsored by

Willkommen im Forum Archiv.
Einträge sind hier nicht mehr möglich, aber der Bestand von 12 Jahren SharePoint-Wissen ist hier recherchierbar.




Werte aus Webpart beziehen

Unbeantwortet Dieser Beitrag hat 12 Antworten

Ohne Rang
37 Beiträge
Chris 22 erstellt 16 Sept. 2010 13:52
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

 Hi,

ich versuche ohne Erfolg Werte eines Webparts, per get/set Methoden außerhalb erreichbar zu machen. Es geht um den aktuellen Kontext. Dieser ist in dem Webpart auch sichtbar, jedoch werden die get/set Variablen nicht initialisiert (das Ganze findet in der RenderContents()-Methode statt), somit findet auch kein korrekter return statt.

Mache ich hier grundsätzlich etwas falsch?

  •  
    • falsche Webpart-Methode verwendet (RenderContents)?

    • Return von lokalen Werten (aus Webpart) nicht möglich?

    • Muss der Werteaustausch über eine Schnittstelle durchgeführt werden?

Wäre für jeden Tip dankbar!

VG

 

Alle Antworten

Ohne Rang
643 Beiträge
Henning Eiben Als Antwort am 16 Sept. 2010 14:05
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Von wo bzw. womit willst du denn die Werte aus dem WebPart zugreifen?

Also, ich verstehe das so, dass du ein WebPart hast, welches dir bestimmte Informationen anzeigt. Diese Werte (Informationen) willst du nun auch woanders (anderes WebPart?) weiterverwenden?

Henning Eiben
busitec.de

Ohne Rang
37 Beiträge
Chris 22 Als Antwort am 16 Sept. 2010 14:14
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Ja genau. Ich erstelle in einer ClassLibrary (kein Webpart) eine Instanz des Webparts und rufe anschließen von hier aus eine get/set - Methode (des Webparts) auf, um an den aktuellen Kontext zu gelangen, welcher sich in dem Webpart befindet. Das Problem ist nur, dass keine Werte aus dem Webpart zurückgegeben werden?!

Ohne Rang
643 Beiträge
Henning Eiben Als Antwort am 16 Sept. 2010 14:19
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

OK, das verstehe ich nicht ganz.

Warum erstellst du aus einer Library heraus eine Instanz des WebParts? Ein WebPart macht doch nur im Portal Sinn, wenn es auch Daten anzeigt. Um was für einen Kontext geht es denn eigentlich? SPContext?

Von wem oder was wird denn diese "Library" ausgeführt?

Henning Eiben
busitec.de

Ohne Rang
37 Beiträge
Chris 22 Als Antwort am 16 Sept. 2010 14:37
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Ich habe hier ein paar Klassen, welche Aktionen auf der gleichen Page ausführen. Diese sind von dem aktuellen User abhängig, welcher über das benannte Webpart (über) ermittelt werden soll.  - Das Webpart dient somit nur zur Erlangung des aktuellen Kontextes, mit SPContext. Es befindet sich zwar auf der entsprechenden Page in einem Portal, zeigt aber nichts an. Die ClassLibrary ist eine normale Klasse (.dll), welche in dem GAC installiert ist.

Ohne Rang
643 Beiträge
Henning Eiben Als Antwort am 16 Sept. 2010 14:50
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Was meinst du mit "Klassen, welche Aktionen auf der gleichen Page ausführen"? Eine Klasse kann nicht innerhalb einer Page ausgeführt werden, lediglich über ein WebPart kann Code auf einer Page ausgeführt werden (außgenommen du hast auf deiner Seite Server-Seitigen Code geschrieben oder User-Controls eingefügt). IdR geht das aber nur über ein WebPart. Oder von wem oder was werden deine Klassen instanziert?

Also, du hast ein WebPart auf einer Seite, welches aber nichts anzeigt. Stattdessen willst du von einer anderen Klasse auf den SPContext aus dem WebPart zugreifen. Wieso so kompliziert? Du kannst einfach in deiner Klasse direkt auf SPContext zugreifen. Solange die Klasse innerhalb der Web-Anwendung ausgeführt wird steht der SPContext zur Verfügung.

Henning Eiben
busitec.de

Ohne Rang
37 Beiträge
Chris 22 Als Antwort am 16 Sept. 2010 15:40
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

 So langsam kommen wir der Sache näher – übrigens danke für die Geduld . :)

Genau. Es ist eine umständliche Lösung um an den SPContext zu gelangen. In den anderen Klassen ist der SPContext leider nicht verfügbar.

Das Ganze sieht grob wie folgt aus:

     

    Eine Klasse (EventReceiver - ItemAdded) erzeugt eine Instanz von Klasse A, welche eine Page (spWeb.Webs.Add(...)) erstellt. Dazu Benutzergruppen und Rollen, sowie weitere Einstellung zu der Page hier brauche ich den aktuellen User, welcher über SPContext ermittelt werden muss. Klar das wird nicht auf der Page ausgeführt. Ich glaube hier liegt auch mein Verständnisproblem. Also was müsste ich in Klasse A machen um an den SPContext zu gelangen? Es ist mir nicht ganz klar. Ich habe verschiedene Möglichkeiten gefunden, welche einen HTTP Request verwenden. Hatte bei mir nicht funktioniert, ich weiß allerdings auch nicht ob es der richtige Weg war...

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 16 Sept. 2010 16:19
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Da bist Du mächtig auf dem Holzweg ;-)

Wenn SPContext.Current leer ist, dann kommst Du auch mit solchen Verrenkungen nicht dran. Entweder er steht im aktuellen Prozeß/Thread zur Verfügung oder eben nicht.

An den gewünschten User kommst Du in Deinem Fall aber ganz einfach über properties.Web.CurrentUser. properties.ListItem["CreatedBy"] würde auch funktionieren.

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
643 Beiträge
Henning Eiben Als Antwort am 16 Sept. 2010 16:29
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Aha - ein Event-Receiver. Die werden doch asynchron verarbeitet; werden die dann eigentlich unter den Credentials des ursprünglichen Aufrufers ausgeführt oder als System? Gibt es da (Event-Receiver) dann überhaupt einen CurrentUser?

Henning Eiben
busitec.de

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 16 Sept. 2010 16:40
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Ja, den gibt es. Aber ich habe ja auch noch die Möglichkeit aufgezeigt, das über CreatedBy zu machen...

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
37 Beiträge
Chris 22 Als Antwort am 21 Sept. 2010 14:52
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

 

Habe das Problem gelöst. Ich hatte mich zu ungenau ausgedrückt, sorry... . Also der Event-Handler befindet sich auf einer Seite, der Rest auf einer zweiten Seite, also wäre der aktuelle Kontext der gewünschten zweiten Seite ein anderer.

 

Den aktuellen Kontext hole ich mir nun von der besagten (zweiten) Seite über den erwähnten Webpart, d.h. über die OnLoad – Methode. Benötigte Kontext Parameter gebe ich somit von hier aus an alle weiteren Instanzen weiter. Funktioniert auch ganz gut, musste nur ziemlich viele Aufrufe nachträglich mit einer SPSecurity .RunWithElevatedPrivileges( delegate ()) versehen, da die Instanzen aus dem Webpart erzeugt werden, dadurch anscheinend nicht mit den aktuellen Userberechtigungen ausgeführt werden.

Übrigens, danke nochmals für die Bemühungen! Tolles Forum hier!

VG

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 21 Sept. 2010 14:59
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Sorry, aber ich halte das mit dem Webpart trotzdem für Quatsch. Du kannst Dir den "Kontext" von jeder beliebigen Website viel einfacher holen:

SPSite site = new SPSite("http://url_der_site");
SPWeb web = site.OpenWeb();

Damit hast Du jedes beliebige SPWeb zur Verfügung...

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
643 Beiträge
Henning Eiben Als Antwort am 28 Sept. 2010 11:50
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Mit den RunWithElevatedPrivileges wäre ich sparsam - die Kosten richtig Leistung. Also nicht um jeden einzelnen Aufruf machen, sondern so selten wie möglich. Außerdem ist das natürlich eine gefährliche Sache, wenn du den Sicherheitskontext wechselst. Wenn dein Code Fehler hat, können böse Dinge passieren.

Henning Eiben
busitec.de