Erstellen von SharePoint 2010-Webparts zum Lesen aus externen Datenquellen und Schreiben in in externe Datenquellen

SharePoint 2010

SharePoint-Videotutorial

Zusammenfassung: Informationen zum Erstellen eines visuellen Webparts mithilfe von Microsoft Visual Studio 2010, das einen externen Inhaltstyp von Microsoft Business Connectivity Services (BCS) in Microsoft SharePoint Server 2010 zum Lesen und Schreiben von Daten in der AdventureWorks-Beispieldatenbank verwendet.

Letzte Änderung: Mittwoch, 12. September 2012

Gilt für: Business Connectivity Services | Office 2010 | SharePoint Foundation 2010 | SharePoint Server 2010 | Visual Studio | Visual Studio 2008 | Visual Studio 2010

Bereitgestellt von: Joel Krist, iSoftStone

Übersicht

Microsoft Business Connectivity Services (BCS) wird mit Microsoft Office 2010 und SharePoint 2010 bereitgestellt. Basierend auf der Funktionalität des Geschäftsdatenkatalogs in Microsoft Office SharePoint Server 2007 gibt es neue Features, wie z. B. die Unterstützung für das Zurückschreiben in externe Systeme und die Rich-Client-Integration. In Visual Studio 2010 wird die Projektvorlage Visuelles Webpart eingeführt. Hiermit können Sie den Designer für visuelle Webparts verwenden, um SharePoint-Webparts zu erstellen und diese dann im Rahmen des Erstellungsprozesses zu packen und bereitzustellen. In diesem Videotutorial erfahren Sie, wie Sie mithilfe von Visual Studio 2010 ein visuelles Webpart, das das BCS-Objektmodell verwendet, für einen externen Inhaltstyp basierend auf der AdventureWorks-Entität Customer erstellen.

Code schreiben

Dieses Videotutorial enthält die folgenden Abschnitte, in denen das Erstellen und Verwenden eines Webparts veranschaulicht wird, das einen externen Inhaltstyp verwendet:

  • Voraussetzungen für die Verwendung des Webparts

  • Erstellen eines visuellen Webpartprojekts mithilfe von Visual Studio 2010

  • Hinzufügen von Verweisen zum visuellen Webpartprojekt

  • Hinzufügen von Code zum Webpart, um dessen Benutzeroberfläche zu definieren und das Arbeiten mit dem externen Inhaltstyp zu unterstützen

  • Erstellen des Webparts, Bereitstellen des Webparts in SharePoint Server und Verwenden des Webparts auf einer Webpartseite

Voraussetzungen für die Verwendung des Webparts

Das in diesem Artikel veranschaulichte Webpart ist mit einem externen Inhaltstyp von BCS kompatibel, der auf den Tabellen Person.Contact, Sales.Customer und Sales.Individual in der AdventureWorks-Beispieldatenbank von Microsoft SQL Server basiert. Der externe Inhaltstyp wird in Microsoft SharePoint Designer 2010 erstellt und verwendet den AdventureWorks-Webdienst, der mit dem Microsoft SharePoint 2010 SDK bereitgestellt wird.

Schwerpunkt dieses Artikels ist das Erstellen des Webparts. Das Installieren der AdventureWorks-Beispieldatenbank, das Bereitstellen des AdventureWorks-Webdiensts oder das Erstellen des externen Inhaltstyps in SharePoint Designer werden nicht detailliert beschrieben. Stattdessen finden Sie in diesem Artikel grundlegende Informationen zu Voraussetzungen sowie Verweise auf andere Inhalte.

Zur Verwendung des hier beschriebenen Webparts ist Folgendes erforderlich:

  • Ein Server mit Microsoft SQL Server 2005 oder Microsoft SQL Server 2008.

  • Die OLTP-Datenbank (Online Transaction Processing, Onlinetransaktionsverarbeitung) von AdventureWorks 2005 installiert auf dem Server mit SQL Server. Die AdventureWorks-Beispieldatenbanken können Sie von CodePlex herunterladen.

  • Ein Server mit SharePoint Server 2010.

  • Der AdventureWorks-Beispielwebdienst bereitgestellt auf einem Webserver. Der Webdienst ist im Lieferumfang des Microsoft SharePoint 2010 SDK enthalten. Standardmäßig sind nach der Installation des SDK die Dateien für den AdventureWorks-Webdienst im folgenden Ordner gespeichert: C:\Program Files (x86)\Microsoft SDKs\SharePoint Server 2010\Samples\Business Connectivity Services\bcs sample kit\BCS Sample Kit\LOB Systems\Adventure Works Web Service.

  • Microsoft SharePoint Designer 2010 installiert auf dem Clientcomputer.

  • Der externe Inhaltstyp WSCustomer basierend auf dem AdventureWorks-Webdienst. Der Artikel Gewusst wie: Erstellen eines externen Inhaltstyps basierend auf einem Webdienst enthält schrittweise Anleitungen zum Erstellen des externen Inhaltstyps WSCustomer in SharePoint Designer 2010.

In den folgenden Abschnitten wird davon ausgegangen, dass alle diese Voraussetzungen erfüllt sind.

Erstellen eines visuellen Webpartprojekts mithilfe von Visual Studio 2010

Im folgenden Verfahren wird veranschaulicht, wie Sie ein visuelles Webpartprojekt erstellen.

So erstellen Sie ein visuelles Webpartprojekt

  1. Starten Sie Visual Studio 2010 als Administrator.

  2. Klicken Sie in Visual Studio im Menü Datei auf Neu, und klicken Sie dann auf Projekt.

  3. Wählen Sie im Dialogfeld Neues Projekt im Bereich Installierte Vorlagen den Vorlagentyp Visual C# SharePoint 2010 aus.

  4. Wählen Sie in der Vorlagenliste die Vorlage Visuelles Webpart aus.

  5. Legen Sie den Namen für das Projekt und die Lösung auf CustomerWebPart fest, und wählen Sie dann .NET Framework 3.5 als Version für das Zielframework aus.

    Abbildung 1. Erstellen der Lösung

    Erstellen der Lösung
  6. Klicken Sie auf OK.

    Der Assistent zum Anpassen von SharePoint wird von Visual Studio gestartet. Geben Sie den Namen der lokalen SharePoint-Website ein, die zum Debuggen verwendet werden soll, und klicken Sie dann auf Fertig stellen.

    Abbildung 2. Assistent zum Anpassen von SharePoint

    SharePoint-Anpassungs-Assistent
  7. Visual Studio erstellt die Lösung und öffnet das Benutzersteuerelement VisualWebPart1UserControl.ascx im Code-Editor.

Hinzufügen von Verweisen zum visuellen Webpartprojekt

Im folgenden Verfahren wird veranschaulicht, wie Sie dem visuellen Webpartprojekt Verweise hinzufügen.

So fügen Sie dem visuellen Webpartprojekt Verweise hinzu

  1. Bei dem für diesen Artikel bereitgestellten Webpart-Beispielcode werden die Klassen und Enumerationen im Microsoft.BusinessData-Namespace verwendet, der von der Microsoft.BusinessData.dll-Assembly bereitgestellt wird. Fügen Sie wie folgt einen Verweis auf die Microsoft.BusinessData-Assembly hinzu:

    1. Klicken Sie in Visual Studio auf Projekt, und klicken Sie dann auf Verweis hinzufügen.

    2. Navigieren Sie im Dialogfeld Verweis hinzufügen auf der Registerkarte Durchsuchen zum folgenden Ordner: C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\14\ISAPI.

    3. Verschieben Sie den Fensterinhalt hinunter bis zur Microsoft.BusinessData.dll-Assembly. Wählen Sie die Assembly aus, und klicken Sie dann auf OK.

      Abbildung 3. Hinzufügen eines Verweises auf "Microsoft.BusinessData"

      Hinzufügen eines Verweises zu 'Microsoft.BusinessData'
  2. Im Beispielcode wird die Color-Klasse verwendet, die in der System.Drawing-Assembly definiert ist. Fügen Sie einen Verweis auf die System.Drawing-Assembly hinzu:

    1. Klicken Sie in Visual Studio auf Projekt, und klicken Sie dann auf Verweis hinzufügen.

    2. Verschieben Sie im Dialogfeld Verweis hinzufügen auf der Registerkarte .NET den Fensterinhalt hinunter bis zur System.Drawing-Komponente, wählen Sie die Komponente aus, und klicken Sie dann auf OK.

      Abbildung 4. Hinzufügen eines Verweises auf "System.Drawing"

      Hinzufügen eines Verweises zu 'System.Drawing'

Hinzufügen von Code zum Webpart

Die Benutzeroberfläche des Webparts ist einfach. Sie besteht aus einer Reihe von Textfeldern, mit denen Sie die Felder des externen Inhaltstyps WSCustomer eingeben und anzeigen können, sowie aus Schaltflächen zum Ausführen der Vorgänge Erstellen, Element suchen und Aktualisieren für den externen Inhaltstyp.

Hinweis Hinweis
Aufgrund von Fremdschlüsseleinschränkungen bei den Tabellen bietet der im Lieferumfang des SharePoint 2010 SDK enthaltene AdventureWorks-Beispielwebdienst keine Unterstützung für das Löschen von Kunden aus der AdventureWorks-Datenbank. Von dem Webpart in diesem Artikel wird deshalb das Löschen nicht unterstützt.

So fügen Sie dem Webpart Code hinzu

  1. Fügen Sie in Visual Studio der Datei VisualWebPart1UserControl.ascx nach den von Visual Studio erstellten Standarddirektiven das folgende Markup hinzu.

    <style type="text/css">
      .style3
      {
        height: 81px;
      }
      .style4
      {
        width: 119px;
      }
      .style5
      {
        width: 559px;
      }
      .style6
      {
        height: 81px;
        width: 119px;
      }
      .style7
      {
       color : #FF3300;
      }
    </style>
    
    <table>
      <tr>
        <td colspan="2">
          To work with the AdventureWorks Customer External Content Type
          (ECT) enter values for the ECT name and namespace, then do the
          following:
            
          <ul style="padding-left: 0px; margin-left: 14px">
            <li>To create a new customer, leave the customer ID blank,
                enter values in the other fields, and then select
                <strong>Create New</strong>.
            </li>
            <li>To find a specific customer, enter the customer&#39;s ID
                and then select <strong>Find by ID</strong>.
            </li>
            <li>To update a customer, enter the customer&#39;s ID and
                updated values for the other fields and then select
                <strong>Update</strong>.
            </li>   
          </ul>
                
          <asp:Label ID="StatusLabel" runat="server"
           ForeColor="#FF3300"></asp:Label>
                
          <br />
          <br />
        </td>
      </tr>
      <tr>
        <td align="left" class="style4">
          ECT Name<span class="style7">*</span></td>
        <td class="style5">
          <asp:TextBox ID="ECTName" runat="server"
           Width="100%"></asp:TextBox>
        </td>
      </tr>
      <tr>
        <td align="left" class="style4">
          ECT Namespace<span class="style7">*</span></td>
        <td class="style5">
          <asp:TextBox ID="ECTNamespace" runat="server"
           Width="100%"></asp:TextBox>
        </td>
      </tr>
      <tr>
        <td align="left" class="style4">&nbsp;</td>
        <td class="style5">&nbsp;</td>
      </tr>
      <tr>
        <td align="left" class="style4">
          Customer ID</td>
        <td class="style5">
          <asp:TextBox ID="CustomerID" runat="server"></asp:TextBox>
        </td>
      </tr>
      <tr>
        <td align="left" class="style4">
          Title</td>
        <td class="style5">
          <asp:TextBox ID="Title" runat="server"></asp:TextBox>
         </td>
      </tr>
      <tr>
        <td align="left" class="style4">
          First Name</td>
        <td class="style5">
          <asp:TextBox ID="FirstName" runat="server"
           Width="100%"></asp:TextBox>
        </td>
      </tr>
      <tr>
        <td align="left" class="style4">
          Middle Name</td>
        <td class="style5">
          <asp:TextBox ID="MiddleName" runat="server"
           Width="100%"></asp:TextBox>
        </td>
      </tr>
      <tr>
        <td align="left" class="style4">
          Last Name</td>
        <td class="style5">
          <asp:TextBox ID="LastName" runat="server"
           Width="100%"></asp:TextBox>
        </td>
      </tr>
      <tr>
        <td align="left" class="style4">
          Email</td>
        <td class="style5">
          <asp:TextBox ID="Email" runat="server"
           Width="100%"></asp:TextBox>
        </td>
      </tr>
      <tr>
        <td align="left" class="style4">
          Phone</td>
        <td class="style5">
          <asp:TextBox ID="Phone" runat="server"
           Width="100%"></asp:TextBox>
        </td>
      </tr>
      <tr>
        <td align="center" class="style6">
          &nbsp;
        </td>
        <td align="center" class="style3">
          <asp:Button ID="CreateNewCustomer" runat="server" 
            OnClick="CreateNewCustomer_Click" Text="Create New"
            Width="120px" />
            &nbsp;
          <asp:Button ID="FindCustomerByID" runat="server" 
            OnClick="FindCustomerByID_Click" Text="Find by ID"
            Width="120px" />
            &nbsp;
          <asp:Button ID="UpdateCustomer" runat="server"
            OnClick="UpdateCustomer_Click" Text="Update"
            Width="120px" />
            &nbsp;
          <asp:Button ID="ClearAllFields" runat="server"
            onclick="ClearAllFields_Click" 
            Text="Clear All Fields" Width="120px" />
        </td>
      </tr>
    </table>
    

    Nachdem Sie dieses Markup hinzugefügt haben, sieht die Benutzeroberfläche beim Anzeigen des Benutzersteuerelements VisualWebPart1UserControl.ascx in derEntwurfsansicht wie in Abbildung 5 aus.

    Abbildung 5. Benutzeroberfläche des Benutzersteuerelements

    Benutzeroberfläche des Benutzersteuerelements
  2. Klicken Sie auf die Datei VisualWebPart1UserControl.ascx, und wählen Sie dann Code anzeigen aus. Die Datei VisualWebPart1UserControl.ascx.cs wird im Code-Editor von Visual Studio geöffnet.

  3. Ersetzen Sie den Inhalt der Datei VisualWebPart1UserControl.ascx.cs durch den folgenden Code.

    using System;
    using System.Drawing;
    using System.Web.UI;
    
    using Microsoft.SharePoint.BusinessData.SharedService;
    using Microsoft.BusinessData.MetadataModel;
    using Microsoft.BusinessData.Runtime;
    using Microsoft.SharePoint.Administration;
    using Microsoft.SharePoint;
    
    using Microsoft.BusinessData.Infrastructure;
    using Microsoft.BusinessData.MetadataModel.Collections;
    
    namespace CustomerWebPart.VisualWebPart1
    {
      public partial class VisualWebPart1UserControl : UserControl
      {
        #region Properties
    
        protected string EntityNamespace
        {
          get { return ECTNamespace.Text.Trim(); }
        }
    
        protected string EntityName
        {
          get { return ECTName.Text.Trim(); }
        }
    
        protected bool EntityValuesAreSet
        {
          get
          {
            if (EntityNamespace == string.Empty ||
              EntityName == string.Empty)
              return false;
            else
              return true;
          }
        }
    
        #endregion
    
        protected void Page_Load(object sender, EventArgs e)
        {
        }
    
        #region Create Customer
    
        protected void CreateNewCustomer_Click(object sender,
          EventArgs e)
        {
          // Ensure that we have values for the entity namespace and name.
          if (!EntityValuesAreSet)
          {
            DisplaySetPropertyValuePrompt(true);
            return;
          }
          else
            DisplaySetPropertyValuePrompt(false);
    
          try
          {
            using (new Microsoft.SharePoint.SPServiceContextScope(
              SPServiceContext.GetContext(SPContext.Current.Site)))
            {
              // Get the BDC service and metadata catalog.
              BdcService service =
               SPFarm.Local.Services.GetValue<BdcService>(String.Empty);
              IMetadataCatalog catalog =
                service.GetDatabaseBackedMetadataCatalog(
                SPServiceContext.Current);
    
              // Get the entity by using the specified name and namespace.
              IEntity entity =
                catalog.GetEntity(EntityNamespace, EntityName);
              ILobSystemInstance LobSysteminstance =
                entity.GetLobSystem().GetLobSystemInstances()[0].Value;
    
              // Get the fields on the entity.
              IView createView =
                entity.GetCreatorView("CreateCustomer");
              IFieldValueDictionary valueDictionary =
                createView.GetDefaultValues();
    
              // Set the values of the entity fields.
              valueDictionary["EmailAddress"] = Email.Text;
              valueDictionary["FirstName"] = FirstName.Text;
              valueDictionary["LastName"] = LastName.Text;
              valueDictionary["MiddleName"] = MiddleName.Text;
              valueDictionary["Phone"] = Phone.Text;
              valueDictionary["Title"] = Title.Text;
    
              // Call the creator method and display the returned
              // Customer ID.
              Identity id = entity.Create(valueDictionary,
                LobSysteminstance);
    
              CustomerID.Text =
                id.GetIdentifierValues().GetValue(0).ToString();
    
              StatusLabel.ForeColor = Color.Green;
              StatusLabel.Text = "Customer successfully created.";
            }
          }
          catch (Exception ex)
          {
            StatusLabel.ForeColor = Color.Red;
            StatusLabel.Text = "Unable to create customer." +
              ex.Message;
          }
        }
    
        #endregion
    
        #region Find Customer By ID
    
        protected void FindCustomerByID_Click(
          object sender, EventArgs e)
        {
          // Ensure that we have values for the entity namespace and name.
          if (!EntityValuesAreSet)
          {
            DisplaySetPropertyValuePrompt(true);
            return;
          }
          else
            DisplaySetPropertyValuePrompt(false);
    
          // Do simple validation of the customer ID. Ensure that it is
          // an integer.  
          int customerID = -1;
    
          if (!ValidateCustomerID(CustomerID.Text, ref customerID))
          {
            ClearFields(false);
            StatusLabel.ForeColor = Color.Red;
            StatusLabel.Text =
              "Please enter an integer for the Customer ID value.";
            return;
          }
    
          try
          {
            using (new Microsoft.SharePoint.SPServiceContextScope(
              SPServiceContext.GetContext(SPContext.Current.Site)))
            {
              // Get the BDC service and metadata catalog.
              BdcService service =
               SPFarm.Local.Services.GetValue<BdcService>(String.Empty);
              IMetadataCatalog catalog =
                service.GetDatabaseBackedMetadataCatalog(
                SPServiceContext.Current);
    
              // Get the entity by using the specified name and namespace.
              IEntity entity =
                catalog.GetEntity(EntityNamespace, EntityName);
              ILobSystemInstance LobSysteminstance =
                entity.GetLobSystem().GetLobSystemInstances()[0].Value;
    
              // Create an Identity based on the specified Customer ID.
              Identity identity = new Identity(customerID);
    
              // Get a method instance for the SpecificFinder method.
              IMethodInstance method =
                entity.GetMethodInstance("GetCustomerById",
                MethodInstanceType.SpecificFinder);
    
              // Execute the Specific Finder method to return the
              // customer data.
              IEntityInstance iei =
                entity.FindSpecific(identity, LobSysteminstance);
    
              // Display the data for the returned customer in the UI.
              Title.Text = iei["Title"] != null ?
                iei["Title"].ToString() : string.Empty;
              FirstName.Text = iei["FirstName"] != null ?
                iei["FirstName"].ToString() : string.Empty;
              MiddleName.Text = iei["MiddleName"] != null ?
                iei["MiddleName"].ToString() : string.Empty;
              LastName.Text = iei["LastName"] != null ?
                iei["LastName"].ToString() : string.Empty;
              Email.Text = iei["EmailAddress"] != null ?
                iei["EmailAddress"].ToString() : string.Empty;
              Phone.Text = iei["Phone"] != null ?
                iei["Phone"].ToString() : string.Empty;
            }
          }
          catch (Exception ex)
          {
            ClearFields(false);
    
            StatusLabel.ForeColor = Color.Red;
            StatusLabel.Text = "Unable to find customer with ID = " +
              CustomerID.Text + ". " + ex.Message;
          }
        }
    
        #endregion
    
        #region Update Customer
    
        protected void UpdateCustomer_Click(object sender, EventArgs e)
        {
          // Ensure that we have values for the entity namespace and name.
          if (!EntityValuesAreSet)
          {
            DisplaySetPropertyValuePrompt(true);
            return;
          }
          else
            DisplaySetPropertyValuePrompt(false);
    
          // Do simple validation of the customer ID. Ensure that it is
          // an integer.     
          int customerID = -1;
    
          if (!ValidateCustomerID(CustomerID.Text, ref customerID))
          {
            StatusLabel.ForeColor = Color.Red;
            StatusLabel.Text =
              "Please enter an integer for the Customer ID value.";
            return;
          }
    
          try
          {
            using (new Microsoft.SharePoint.SPServiceContextScope(
              SPServiceContext.GetContext(SPContext.Current.Site)))
            {
              // Get the BDC service and metadata catalog.
              BdcService service =
               SPFarm.Local.Services.GetValue<BdcService>(String.Empty);
              IMetadataCatalog catalog =
                service.GetDatabaseBackedMetadataCatalog(
                SPServiceContext.Current);
    
              // Get the entity by using the specified name and namespace.
              IEntity entity =
                catalog.GetEntity(EntityNamespace, EntityName);
              ILobSystemInstance LobSysteminstance =
                entity.GetLobSystem().GetLobSystemInstances()[0].Value;
              
              // Create an Identity based on the specified Customer ID.
              Identity identity = new Identity(customerID);
    
              // Get a method instance for the Updater method.
              IMethodInstance method =
                entity.GetMethodInstance("UpdateCustomer",
                MethodInstanceType.Updater);
    
              // The UpdateCustomer method of the external content type
              // maps to the UpdateCustomer method in the AdventureWorks
              // web service. Looking at the source for the web service
              // shows that the UpdateCustomer method has the following
              // signature:
              //
              // public void UpdateCustomer(SalesCustomer customer)
              //
              // The SalesCustomer type has the following layout: 
              //
              // public class SalesCustomer
              // {
              //     public int CustomerId { get; set; }
              //     public String Title { get; set; }
              //     public String FirstName { get; set; }
              //     public String MiddleName { get; set; }
              //     public String LastName   { get; set; }
              //     public String EmailAddress { get; set; }
              //     public String Phone { get; set; }
              //     public DateTime ModifiedDate { get; set; }
              // }
    
              // Get the collection of parameters for the method.
              // In this case, there is only one.
              IParameterCollection parameters =
                method.GetMethod().GetParameters();
    
              // Use type reflection to get an instance of a
              // SalesCustomer object to pass as a parameter.
              ITypeReflector reflector = parameters[0].TypeReflector;
              ITypeDescriptor rootTypeDescriptor =
                parameters[0].GetRootTypeDescriptor();
    
              object[] methodParamInstances =
                method.GetMethod().CreateDefaultParameterInstances(
                method);
              Object instance = methodParamInstances[0];
    
              // Get type descriptors for each of the SalesCustomer
              // members.
              ITypeDescriptor customerIDTypeDescriptor =
                rootTypeDescriptor.GetChildTypeDescriptors()[0];
              ITypeDescriptor titleTypeDescriptor =
                rootTypeDescriptor.GetChildTypeDescriptors()[1];
              ITypeDescriptor firstNameTypeDescriptor =
                rootTypeDescriptor.GetChildTypeDescriptors()[2];
              ITypeDescriptor middleNameTypeDescriptor =
                rootTypeDescriptor.GetChildTypeDescriptors()[3];
              ITypeDescriptor lastNameTypeDescriptor =
                rootTypeDescriptor.GetChildTypeDescriptors()[4];
              ITypeDescriptor emailAddressTypeDescriptor =
                rootTypeDescriptor.GetChildTypeDescriptors()[5];
              ITypeDescriptor phoneTypeDescriptor =
                rootTypeDescriptor.GetChildTypeDescriptors()[6];
              ITypeDescriptor modifiedDateTypeDescriptor =
                rootTypeDescriptor.GetChildTypeDescriptors()[7];
    
              // Set the values of the SalesCustomer object members
              // with the values specified by the user.
              reflector.Set(customerIDTypeDescriptor,
                rootTypeDescriptor,
                ref instance, customerID);
              reflector.Set(titleTypeDescriptor, rootTypeDescriptor,
                ref instance, Title.Text);
              reflector.Set(firstNameTypeDescriptor, rootTypeDescriptor,
                ref instance, FirstName.Text);
              reflector.Set(middleNameTypeDescriptor,
                rootTypeDescriptor,
                ref instance, MiddleName.Text);
              reflector.Set(lastNameTypeDescriptor, rootTypeDescriptor,
                ref instance, LastName.Text);
              reflector.Set(emailAddressTypeDescriptor,
                rootTypeDescriptor,
                ref instance, Email.Text);
              reflector.Set(phoneTypeDescriptor, rootTypeDescriptor,
                ref instance, Phone.Text);
              reflector.Set(modifiedDateTypeDescriptor,
                rootTypeDescriptor,
                ref instance, DateTime.Now);
    
              // Execute the updater method, passing the parameter.
              entity.Execute(method, LobSysteminstance,
                ref methodParamInstances);
    
              StatusLabel.ForeColor = Color.Green;
              StatusLabel.Text = "Customer successfully updated.";
            }
          }
          catch (Exception ex)
          {
            StatusLabel.ForeColor = Color.Red;
            StatusLabel.Text = "Unable to find customer with ID = " +
              CustomerID.Text + ". " + ex.Message;
          }
        }
    
        #endregion
    
        #region Helpers
    
        protected void DisplaySetPropertyValuePrompt(bool showPrompt)
        {
          if (showPrompt)
          {
            StatusLabel.ForeColor = Color.Red;
            StatusLabel.Text =
              "Please enter values for the ECT name and namespace!";
          }
          else
            StatusLabel.Text = string.Empty;
        }
    
        protected void ClearAllFields_Click(object sender, EventArgs e)
        {
          ClearFields(true);
        }
    
        protected bool ValidateCustomerID(string CustomerIDIn,
          ref int CustomerIDOut)
        {
          try
          {
            CustomerIDOut = Convert.ToInt32(CustomerIDIn);
            return true;
          }
          catch
          {
            CustomerIDOut = -1;
            return false;
          }
        }
    
        protected void ClearFields(bool clearCustomerID)
        {
          if (clearCustomerID)
            CustomerID.Text = string.Empty;
    
          Title.Text = string.Empty;
          FirstName.Text = string.Empty;
          MiddleName.Text = string.Empty;
          LastName.Text = string.Empty;
          Email.Text = string.Empty;
          Phone.Text = string.Empty;
        }
    
        #endregion
      }
    }
    
    

Erstellen, Bereitstellen und Verwenden des Webparts

Im folgenden Verfahren wird veranschaulicht, wie Sie das Webpart erstellen, bereitstellen und verwenden.

So können Sie das Webpart erstellen, bereitstellen und verwenden

  1. Klicken Sie in Visual Studio im Menü Erstellen auf Projektmappe bereitstellen.

    Visual Studio erstellt die Webpartassembly, erstellt die erforderlichen Feature- und Bereitstellungsdateien, packt alles in ein SharePoint-Lösungspaket und stellt es auf der lokalen SharePoint-Website bereit, die Sie beim Erstellen der Lösung angegeben haben.

    Abbildung 6. Erstellen und Bereitstellen des Webparts

    Erstellen und Bereitstellen des Webparts
  2. Navigieren Sie zu der SharePoint-Website, auf der Sie das Webpart bereitgestellt haben.

  3. Klicken Sie im Menü Websiteaktionen auf Neue Seite.

    Abbildung 7. Dialogfeld "Neue Seite"

    Dialogfeld 'Neue Seite'
  4. Geben Sie im Dialogfeld Neue Seite einen Namen für die neue Seite ein, und klicken Sie dann auf Erstellen. SharePoint Server erstellt die neue Seite und navigiert zu ihr.

  5. Klicken Sie auf der neuen Seite auf der Registerkarte Einfügen in der Gruppe Webparts auf Webpart.

    Abbildung 8. Hinzufügen des Webparts zur Seite

    Hinzufügen des Webparts zur Seite
  6. Von SharePoint Server wird die Benutzeroberfläche angezeigt, mit der Sie das Webpart auswählen können. Wählen Sie unter Kategorien die Option Benutzerdefiniert aus. Das visuelle Webpart wird in der Liste der verfügbaren Webparts aufgeführt. Wählen Sie das Webpart aus, und klicken Sie dann auf Hinzufügen.

    Abbildung 9. Auswählen des Webparts

    Auswählen des Webparts

    Das Webpart wird der Seite hinzugefügt.

    Abbildung 10. Webpart auf der Seite

    Webpart auf der Seite
  7. Speichern Sie die Änderungen an der Seite, indem Sie über dem Menüband auf das Symbol Speichern klicken.

  8. Geben Sie Werte für den Namen und den Namespace des externen Inhaltstyps ein.

    Wenn Sie sich genau an die Schritte in Gewusst wie: Erstellen eines externen Inhaltstyps basierend auf einem Webdienst gehalten haben, lautet der Name des externen Inhaltstyps WSCustomer, und der Namespace basiert auf dem Namen des Webservers, von dem der AdventureWorks-Webdienst gehostet wird. Führen Sie die folgenden Schritte aus, um den Namen und den Namespace des externen Inhaltstyps zu bestimmen:

    1. Öffnen Sie die Website der SharePoint-Zentraladministration auf dem Server, auf dem Sie den externen Inhaltstyp mithilfe von SharePoint Designer bereitgestellt haben.

    2. Wählen Sie Anwendungsverwaltung aus.

    3. Wählen Sie auf der Seite Anwendungsverwaltung den Eintrag Dienstanwendungen verwalten aus.

    4. Wählen Sie auf der Seite Dienstanwendungen den Link für die Business Data Connectivity-Dienstanwendung aus.

      Die Seite Dienstanwendungsinformationen wird angezeigt. Die Details des externen AdventureWorks-Inhaltstyps WSCustomer werden aufgelistet.

      Abbildung 11. Details des externen Inhaltstyps

      Details zu externen Inhaltstypen
  9. Geben Sie in der Webpart-Benutzeroberfläche einen gültigen Wert für Kunden-ID ein. Gültige Kunden-IDs können Sie bestimmen, indem Sie z. B. mit einem Tool wie SQL Server Management Studio die Sales.Individual-Tabelle in der AdventureWorks-Datenbank abfragen.

  10. Klicken Sie auf Find by ID.

    Das Webpart zeigt die Daten für den Kunden mit der angegebenen ID an. Sie werden aus der AdventureWorks-Datenbank über den externen Inhaltstyp mithilfe des AdventureWorks-Webdiensts abgerufen.

    Abbildung 12. Webpart mit angezeigten AdventureWorks-Kundendaten

    Webpart, in dem AdventureWorks angezeigt wird
  11. Ändern Sie die Daten für den Kunden, lassen Sie die Kunden-ID unverändert, und klicken Sie dann auf Update. Das Webpart verwendet den externen Inhaltstyp zum Aktualisieren der Kundendaten.

    Abbildung 13. Aktualisieren von Kundendaten

    Aktualisieren von Kundendaten
  12. Erstellen Sie einen neuen Kunden, indem Sie auf Clear All Fields klicken und anschließend Daten für einen neuen Kunden eingeben, wobei Sie das Feld Kunden-ID leer lassen. Klicken Sie auf Create New. Das Webpart verwendet den externen Inhaltstyp, um der AdventureWorks-Datenbank einen neuen Kunden hinzuzufügen.

    Abbildung  14. Erstellen eines neuen Kunden

    Erstellen eines neuen Kundens

    Mithilfe von SQL Server Management Studio können Sie die AdventureWorks-Datenbank abfragen, um sicherzustellen, dass die Webpartvorgänge über den externen Inhaltstyp ordnungsgemäß ausgeführt werden.

    Abbildung 15. SQL Server Management Studio

    SQL Server Management Studio
Lesen

Dieses Videotutorial enthält Schritte und Beispielcode zur Veranschaulichung, wie Sie mithilfe von Visual Studio 2010 ein visuelles Webpart erstellen, das einen externen Inhaltstyp von BCS zum Lesen und Schreiben von Daten in der AdventureWorks-Datenbank verwendet. Der Beispielcode zeigt, wie Sie die Methoden Create, Specific Finder und Update des externen Inhaltstyps verwenden, der auf dem mit dem SharePoint 2010 SDK bereitgestellten AdventureWorks-Beispielwebdienst basiert.

Jede Methode des Webparts verwendet dieselbe Vorgehensweise zum Abrufen von Verweisen auf den freigegebenen BDC-Dienst und den Metadatenkatalog auf dem Server sowie zum Abrufen der Kundenentität aus dem Katalog.

// Get the BDC service and metadata catalog.
BdcService service =
  SPFarm.Local.Services.GetValue<BdcService>(String.Empty);
IMetadataCatalog catalog = service.GetDatabaseBackedMetadataCatalog(
  SPServiceContext.Current);

// Get the entity by using the specified name and namespace.
IEntity entity =
  catalog.GetEntity(EntityNamespace, EntityName);
ILobSystemInstance LobSysteminstance =
  entity.GetLobSystem().GetLobSystemInstances()[0].Value;

Bei diesen Methoden werden dann unterschiedliche Vorgehensweisen zum Implementieren der Funktionalität verwendet. Der Code im Zusammenhang mit Create ermöglicht eine Ansicht der CreateCustomer-Methode des externen Inhaltstyps, damit die Entitätsfelder abgerufen und festgelegt werden können, die dann an die Creator-Methode der Entität übergeben werden.

// Get the fields on the entity.
IView createView = entity.GetCreatorView("CreateCustomer");
IFieldValueDictionary valueDictionary =
  createView.GetDefaultValues();

// Set the values of the entity fields.
valueDictionary["EmailAddress"] = Email.Text;
valueDictionary["FirstName"] = FirstName.Text;
valueDictionary["LastName"] = LastName.Text;
valueDictionary["MiddleName"] = MiddleName.Text;
valueDictionary["Phone"] = Phone.Text;
valueDictionary["Title"] = Title.Text;

// Call the creator method and display the returned
// Customer ID.
Identity id = entity.Create(valueDictionary,
  LobSysteminstance);

Mit dem Code im Zusammenhang mit Specific Finder wird ein Identity-Objekt erstellt, und anschließend wird eine Methodeninstanz für die Specific Finder-Methode des externen Inhaltstyps abgerufen. Danach wird die FindSpecific-Methode für die Entität aufgerufen, die ein IEntityInstance-Objekt zurückgibt, das die Daten für den angegebenen Kunden enthält.

// Create an Identity based on the specified Customer ID.
Identity identity = new Identity(customerID);

// Get a method instance for the SpecificFinder method.
IMethodInstance method =
  entity.GetMethodInstance("GetCustomerById",
  MethodInstanceType.SpecificFinder);

// Execute the Specific Finder method to return the
// customer data.
IEntityInstance iei =
  entity.FindSpecific(identity, LobSysteminstance);

Mit dem Code im Zusammenhang mit Update wird ein Identity-Objekt erstellt, und anschließend wird eine Methodeninstanz für die Updater-Methode des externen Inhaltstyps abgerufen. Die Methodeninstanz wird zum Abrufen der Parameter verwendet, die von der Updater-Methode akzeptiert werden, und anschließend wird mithilfe der Typspiegelung eine Instanz des Objekts erstellt und initialisiert, die an die Methode übergeben werden soll. Schließlich wird IEntity.Execute aufgerufen, um die Updater-Methode des externen Inhaltstyps aufzurufen, wobei der Parameter mit den aktualisierten Werten für den Kunden übergeben wird.

// Create an Identity based on the specified Customer ID.
Identity identity = new Identity(customerID);

// Get a method instance for the Updater method.
IMethodInstance method =
  entity.GetMethodInstance("UpdateCustomer",
  MethodInstanceType.Updater);

// Get the collection of parameters for the method.
// In this case, there is only one.
IParameterCollection parameters =
  method.GetMethod().GetParameters();

// Use type reflection to get an instance of a
// SalesCustomer object to pass as a parameter.
ITypeReflector reflector = parameters[0].TypeReflector;
ITypeDescriptor rootTypeDescriptor =
  parameters[0].GetRootTypeDescriptor();

object[] methodParamInstances =
  method.GetMethod().CreateDefaultParameterInstances(
  method);
Object instance = methodParamInstances[0];

// Get type descriptors for each of the SalesCustomer
// members.
ITypeDescriptor customerIDTypeDescriptor =
  rootTypeDescriptor.GetChildTypeDescriptors()[0];
ITypeDescriptor titleTypeDescriptor =
  rootTypeDescriptor.GetChildTypeDescriptors()[1];
ITypeDescriptor firstNameTypeDescriptor =
  rootTypeDescriptor.GetChildTypeDescriptors()[2];
ITypeDescriptor middleNameTypeDescriptor =
  rootTypeDescriptor.GetChildTypeDescriptors()[3];
ITypeDescriptor lastNameTypeDescriptor =
  rootTypeDescriptor.GetChildTypeDescriptors()[4];
ITypeDescriptor emailAddressTypeDescriptor =
  rootTypeDescriptor.GetChildTypeDescriptors()[5];
ITypeDescriptor phoneTypeDescriptor =
  rootTypeDescriptor.GetChildTypeDescriptors()[6];
ITypeDescriptor modifiedDateTypeDescriptor =
  rootTypeDescriptor.GetChildTypeDescriptors()[7];

// Set the values of the SalesCustomer object members
// with the values specified by the user.
reflector.Set(customerIDTypeDescriptor, rootTypeDescriptor,
  ref instance, customerID);
reflector.Set(titleTypeDescriptor, rootTypeDescriptor,
  ref instance, Title.Text);
reflector.Set(firstNameTypeDescriptor, rootTypeDescriptor,
  ref instance, FirstName.Text);
reflector.Set(middleNameTypeDescriptor, rootTypeDescriptor,
  ref instance, MiddleName.Text);
reflector.Set(lastNameTypeDescriptor, rootTypeDescriptor,
  ref instance, LastName.Text);
reflector.Set(emailAddressTypeDescriptor, rootTypeDescriptor,
  ref instance, Email.Text);
reflector.Set(phoneTypeDescriptor, rootTypeDescriptor,
  ref instance, Phone.Text);
reflector.Set(modifiedDateTypeDescriptor, rootTypeDescriptor,
  ref instance, DateTime.Now);

// Execute the updater method, passing the parameter.
entity.Execute(method, LobSysteminstance,
  ref methodParamInstances);

Anzeigen

Video ansehen

Video anschauen (00:15:57)

Klicken Sie hier, um den Code abzurufen

Code abrufen

Erforschen
Anzeigen: