SharePointCommunity
Die deutschsprachige SharePoint Community mit Infos zu SharePoint - speziell SharePoint 2010 und SharePoint 2007


Webbasierte InfoPath-Formulare in eine SharePoint Site integrieren

Blogs

Fabian´s Blog [SharePoint MVP]

Syndication

Webbasierte InfoPath-Formulare werden mithilfe eines Web Server Controls über eine dedizierte ASP.NET Website bereitgestellt (z.B. http://servername/_layouts/Formserver.aspx). Durch diese Implementierung werden die Formulare stets in einer „leeren“ Seite ausgeliefert und verlieren somit den kompletten Kontext (Navigation, Breadcrumb, etc.) der darunterliegenden Webseite.

In vielen Umgebungen besteht jedoch die Anforderung, das Formular direkt in die SharePoint Site zu integrieren. Für diese Anforderung liefert SharePoint zwei Lösungsvarianten.

  1. Den Site Viewer Webpart
  2. Das Forms Services Web Server Control (XmlFormView)

Die erste Variante ist schnell realisiert. Einen Site Viewer Webpart auf die Website positionieren und in den Webpart-Einstellungen den Pfad zum Webformular eintragen. Nachteil dieser Variante ist, dass für den Webpart eine feste Höhe definiert werden muss. Ist prinzipiell auch kein Problem, allerdings wird es spätestens dann unschön, wenn das Formular über mehrere Ansichten verfügen, die unterschiedlich hoch sind. Zudem gibt es über den Site Viewer Webpart keine Möglichkeiten auf Daten oder Ereignisse des Formulars zuzugreifen.

Die Alternative ist die Entwicklung eines benutzerdefinierten Webparts, der das InfoPath-Formular hostet. Der Office SharePoint Server stellt über das XmlFormView-Control die Möglichkeit bereit, InfoPath-Formulare in einem beliebigen ASP.NET Control zu hosten. Folgender Programmcode demonstriert die Implementierung des XmlFormView-Controls innerhalb eines Webparts. Über eine Eigenschaft bekommt der Webpart die Quelle des Form Templates und sorgt für ein automatisches Rendering des Formulars.

using System;
using System.Collections.Generic;
using System.Text;
using System.Web.UI.WebControls.WebParts;
using Microsoft.Office.InfoPath.Server.Controls;
 
namespace FM.WebParts
{
    public class FormContainer : WebPart
    {        
        private string _xsnlocation = "";
        private XmlFormView viewform;
 
        [Personalizable(),
         WebBrowsable(),
         WebDisplayName("XSNLocation"),
         WebDescription("URL of the web-enabled InfoPath form to display")]
        public string XSNLocation
        {
            get{return _xsnlocation;}
            set{_xsnlocation = value;}
        }
 
        public FormContainer()
        {
            this.ChromeType = PartChromeType.None;
        }
 
        protected override void CreateChildControls()
        {            
            viewform = new XmlFormView();
 
            if (this._xsnlocation.Length > 0)
            {
                viewform.XsnLocation = this._xsnlocation;
                this.Controls.Add(viewform);
            }
        }
    }
}

Um das XmlFormView-Control in einem Webpart nutzen zu können, muss dem Projekt eine Referenz auf die InfoPath Server Assembly (%ProgramDir%\Microsoft Office Servers\12.0\Bin\Microsoft.Office.InfoPath.Server.dll) hinzugefügt werden. Weitere Dinge sind in der Umsetzung des Webparts nicht zu beachten.

Das komplette Webpart-Projekt incl. Feature und Solution-Definition kann hier heruntergeladen werden.

Innerhalb des Webparts kann direkt auf Daten oder Ereignisse des Formulars zugegriffen werden. Folgendes Beispiel veranschaulicht den Zugriff auf spezielle Knoten des gehosteten Formulars.

void viewform_Initialize(object sender, InitializeEventArgs e)
{
    XPathNavigator xNavRoot = viewform.XmlForm.MainDataSource.CreateNavigator();
    XmlNamespaceManager xNameSpace = new XmlNamespaceManager(new NameTable());
    xNameSpace.AddNamespace("my", "http://schemas.microsoft.com/office/infopath/2003/myXSD/2006-04-20T16:26:21");
    XPathNavigator xNavField = xNavRoot.SelectSingleNode("my:Person/my:Name", xNameSpace);
    xNavField.SetValue();
}

Die Methode CreateNavigator liefert ein XPathNavigator-Objekt, mit dem der gesamte Baum des XML-Dokuments iteriert werden kann. Wichtig ist die Registrierung des „my“-Namespaces. Danach kann über das Objektmodell von System.Xml auf beliebige Knoten des XML-Dokuments zugegriffen werden. Neben dem Initialize-Ereignis stellt das XmlFormView-Control noch weitere Eigenschaften, Ereignisse und Methoden für den Zugriff und die Steuerung des InfoPath-Formulars bereit. Eine komplette Referenz der XmlFormView-Klasse liefert die MSDN. http://msdn.microsoft.com/en-us/library/microsoft.office.infopath.server.controls.xmlformview.aspx

Wer möchte, kann sich den kompletten Webpart als installationsfähige SharePoint Solution herunterladen. Folgende Schritte sind zur Installation erforderlich.

  1. Solution über stsadm installieren
    stsadm -o addsolution -filename FabiansFormContainerWebPart.wsp

  2. Solution in der Farm deployen
    Das Deployment kann über zwei Wege durchgeführt werden. In der Zentraladministration über Operation > Solution Management > FabiansFormContainerWebPart.wsp > Deploy Solution oder über stsadm: stsadm -o deploySolution -name FabiansFormContainerWebpart.wsp -allcontenturls -local


  3. Feature aktivieren
    Nach dem erfolgreichen Solution-Deployment kann das Feature, das den FormContainer-Webpart bereitstellt, in einer beliebigen Site Collection aktiviert werden (Websiteaktionen > Websiteeinstellungen > Websitesammlungsfeatures > Fabian´s FormContainer Webpart > aktivieren)


  4. Webpart bereitstellen
    Das Feature registriert den FormContainer.Webpart in der Webpart-Galerie.


    Der Webpart erwartet als einzige Einstellung die Pfad zum InfoPath Template und sollte danach das InfoPath-Formular in Kontext der SharePoint Seite darstellen

Neben der Umsetzung eines SharePoint Webparts besteht auch die Möglichkeit, das XmlFormView-Control in einer ASP.NET Webseite zu verwenden und so die InfoPath-Formulare ohne SharePoint bereitzustellen. Wir machen in unseren Projekten sehr viel Gebrauch von dieser Technologie. Durch die Verwendung von InfoPath im Zusammenspiel mit den Forms Services lassen sehr einfach und ohne viel Programmieraufwand komplette Formularlösungen realisieren, die sich flexible erweitern und anpassen lassen.


Bereitgestellt 10 Jun 2008 6:37 von Fabian Moritz

Kommentare

Patrick geschrieben re: Webbasierte InfoPath-Formulare in eine SharePoint Site integrieren
on 16 Apr 2010 11:07

Super Beitrag - genau das, was ich gesucht habe!

danke!