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.




Externe URL innerhalb von Sharepoint anzeigen + Daten aus AD Query einbinden!

Unbeantwortet Dieser Beitrag hat 10 Antworten

Ohne Rang
46 Beiträge
Markus Doll erstellt 10 Dez. 2012 17:12
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Hallo zusammen,

ich muss eine unserer Unternehmensinternen alten Weblösungen in unseren Sharepoint integrieren.

Konkret soll der User beim Laden einer speziellen Sharepointseite bzw. beim Klicken auf einen Link, die Weblösung angzeigt bekommen, als würde sie innerhalb Sharepoint laufen.

Wäre es nur das, würde ich mich dem Pageviewer Webpart bedienen.

Dummerweise muss der aufzurufende Link dynamisch mit Daten aus dem AD gefüttert werden und ich habe keine Ahnung, wie ich das anstellen soll.

Die Daten im AD stehen in einem der extentionattributes, der Link sieht aus ala https://servername.tld/id=xxxx, wobei xxxx durch den Wert aus dem AD ersetzt werden muss.

Wenn es nichts passendes gibt, würde ich auch nicht davor zurückschrecken ein Webpart in VS zu schreiben, jedoch bräuchte ich dort ein paar Links auf Howto's um mich mit der Materie vertraut zu machen. Meine Suchstrings scheinen nicht geeignet, auf jeden Fall bekomme ich von Google nichts brauchbares zurück.

Die Abfrage der AD Daten ist indes kein Problem...

Hat jemand eine Idee, wie diese Situation zu lösen ist?

Danke im Vorraus!

Vg,

Markus

Alle Antworten

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 11 Dez. 2012 07:59
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Ich denke ein eigenes Webpart wäre die sinnvollste Lösung. Wo genau klemmt's denn bzw. was hast Du schon?

Im Grunde ist es ziemlich einfach: Erstelle ein neues Projekt in Visual Studio und füge ihm ein Webpart hinzu. In dessen CreateChildControls() erzeugst Du einen Link mit der passenden URL angereichert mit den Daten des aktuellen Users aus dem AD.

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
46 Beiträge
Markus Doll Als Antwort am 11 Dez. 2012 12:31
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Hallo Andi,

danke für Deine Antwort.

Es klemmt genau an der Stelle, wo ich im VS im Webpartcode bin und nicht weiß, wie ich jetzt das Webpart dazu bringe eine Seite anzuzeigen.

Ich habe meinen Link gebastelt und nun in einer Variablen, aber dann hörts auf.

Auch wenn ich mittlerweile - nicht zuletzt durch Deine Hilfe - schon ein paar Dinge auf Sharepoint (EventReceiver z.B.) Basis hinbekommen habe, habe ich noch nie was mit Webparts gemacht und keinen blassen Dunst, wie hier die Herangehensweise ist.

Vielen Dank & Gruß,

Markus

 

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 11 Dez. 2012 12:48
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

OK, Du hast also eine Klasse, die von WebPart erbt. Entferne allen evtl. vorhandenen Code. Überschreibe die Methode CreateChildControls (override eintippen und dann aus Intellisense auswählen). Du brauchst dazu (erstmal) nur diese Methode.

Über SPContext.Current.Web.CurrentUser bekommst Du den aktuellen User als SPUser. In dessen Eigenschaften solltest Du alles finden, was Du brauchst wie z.B. den Login (Domäne\Login). Damit fragst Du das AD ab.

Jetzt erzeugst Du einen neuen Link, setzt dessen Eigenschaften und fügst ihn der Controls-Collection hinzu (braucht System.Web.UI.WebControls):

HyperLink lnk = new HyperLink();
lnk.Text = "Angezeigter Text";
lnk.NavigateUrl = "http://domain.tld/whatever"; // hier setzt Du den eigentlichen Link
this.Controls.Add(lnk);

Das war es auch schon. HyperLink hat natürlich noch weitere Eigenschaften, an denen Du schrauben kannst, aber für die grundsätzliche Funktion reicht das.

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
46 Beiträge
Markus Doll Als Antwort am 12 Dez. 2012 09:50
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Moin Andi,

danke für den Anschub, das war genau die Information zum Einstieg, die ich brauchte.

Nach einigen Problemen mit der Abfrage des GCs für die Userdaten ist jetzt soweit alles fertig und der Link wird angezeigt.

Das einzige, was jetzt noch fehlt ist, dass das Webpart die korespondierende Seite aufruft und anzeigt.

Wenn der User die Seite öffnet, auf der das Webpart läuft, soll er direkt die hinter dem Link liegende Seite angezeigt bekommen und nicht erst auf den Link klicken müssen. Vom Verhalten her, sollte es so wie das Pageviewer Webpart sein.

Muss ich hierfür vorher ein Pageviewer Webpart einfügen, dessen Contentlink ich dann zur Laufzeit ändere, oder gibt es dafür eine Smartere Lösung?

Danke & Vg,

Markus

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 12 Dez. 2012 10:22
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Dann lasse das Webpart doch einfach statt des Links einen <iframe> mit entsprechendem src-Attribut erzeugen.

Für IFrames gibt es zwar kein WebControl, aber Du kannst das LiteralControl nehmen:
LiteralControl lit = new LiteralControl("<iframe src='hier Deine URL' width='200' height='200'/>");

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
46 Beiträge
Markus Doll Als Antwort am 12 Dez. 2012 12:47
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Danke Andi!

Ich habe es im Endeffekt so gemacht, das ich auf die Seite mein und ein Pageviewerwebpart gepackt habe.

Mein Webpart erstellt den Link und setzt dann anschließend den "ContentLink" des Pageviewerwebparts auf den korrekten wert.

Habe mal wieder einiges dazu gelernt, was ich jetzt nach und nach Ausbauen kann.

Fall es jemanden Interessiert, wie es jetzt aussieht, hier ist der Code:

        protected override void CreateChildControls()

        {

            string strUsername = SPContext.Current.Web.CurrentUser.LoginName;

            string strShortname = strUsername.Substring(strUsername.LastIndexOf("\\") + 1, strUsername.Length - strUsername.LastIndexOf("\\") - 1);

            string strPersonID = RetrieveUsersPersonID(strShortname);

            string strRegtimeLink = "https://yourwebapplicationhere/index.php?OpenForm&&&" + strPersonID;            

            SPWeb myweb = SPContext.Current.Web;

            Microsoft.SharePoint.WebPartPages.SPLimitedWebPartManager wpm = myweb.GetLimitedWebPartManager("default.aspx",System.Web.UI.WebControls.WebParts.PersonalizationScope.Shared );

            Microsoft.SharePoint.WebPartPages.SPLimitedWebPartCollection col = wpm.WebParts;

            foreach (WebPart wp in col)

            {

     if (wp.GetType().ToString() == "Microsoft.SharePoint.WebPartPages.PageViewerWebPart")

   {

                    Microsoft.SharePoint.WebPartPages.PageViewerWebPart pageViewer = (Microsoft.SharePoint.WebPartPages.PageViewerWebPart)wp;

                    pageViewer.ContentLink = strRegtimeLink;

                    wpm.SaveChanges(pageViewer);

                }

            }

        }

Vg,

Markus

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 12 Dez. 2012 12:55
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

[quote user="Markus Doll"]Mein Webpart erstellt den Link und setzt dann anschließend den "ContentLink" des Pageviewerwebparts auf den korrekten wert[/quote]

Bißchen umständlich, aber wenn es funktioniert... ;-)

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
46 Beiträge
Markus Doll Als Antwort am 12 Dez. 2012 15:03
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Umständlich ist es in der Tat, jedoch erreiche ich nur so den zufriedenstellenden Effekt, was die Art und Weise, wie die Seite angezeigt wird.

Wenn ich über die LiteralControls einen IFRAME einfüge, zerschiesst der in irgendeiner Art Weise die UI Funktionen, ich kann dann nicht mehr auf die Site Actions zugreifen (z.b.) es passiert einfach nichts.

Bin gerade noch dran, das das Pageviewer Webpart ausgeblendet wird, wenn im AD keine passenden Daten im User stehen, und experimentiere gerade mit dem Methoden.

Wenn ich das in den Childcontrols mache, wirkt sich das setzen auf Hidden bzw. Visible=false nicht aus.

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 12 Dez. 2012 15:26
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

[quote user="Markus Doll"]Wenn ich über die LiteralControls einen IFRAME einfüge, zerschiesst der in irgendeiner Art Weise die UI Funktionen[/quote]

Ich würde mir da den HTML-Code ansehen, der vom pageViewerWebPart erzeugt wird. Im IE kann man das über Rechtsklick - View Source oder schöner über die Entwicklertools machen (F12). Wenn Du weißt, was dieses WebPart macht, kannst Du mit Deinem eigenen Webpart die identische Ausgabe erzeugen. Dann wird's auch einfacher mit dem Ausblenden, wenn es keine passenden Daten gibt...

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
46 Beiträge
Markus Doll Als Antwort am 12 Dez. 2012 17:01
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Habe ich jetzt so umgesetzt, da es in der Tat viel weniger Probleme mit sich bringt :)