Übersicht über den ASP.NET Dynamic Data-Gerüstbau und Seitenvorlagen

Aktualisiert: November 2007

Eine häufig vorkommende Aufgabe in der Softwareentwicklung sind das Anzeigen und Bearbeiten von Daten. ASP.NET Dynamic Data ermöglicht Ihnen, datengesteuerte Anwendungen mit wenig oder keinem Code zu erstellen. Der Gerüstmechanismus ist ein wichtiges Feature von Dynamic Data, mit dem Sie diese Anwendungen schnell erstellen können.

Dieses Thema enthält folgende Abschnitte:

  • Gerüstbau

  • Seitenvorlagen

Gerüstbau

Der Gerüstbau ist ein Mechanismus, der die Leistungsfähigkeit und Funktionalität des vorhandenen ASP.NET-Seitenframeworks nutzt und dieses durch die dynamische Anzeige von Seiten basierend auf dem Datenmodell ohne eine physische Seite im Hintergrund optimiert.

Der Gerüstmechanismus bietet folgende Vorteile:

  • Wenig oder kein Code zum Erstellen einer datengesteuerten Webanwendung.

  • Kurze Entwicklungsdauer.

  • Voll funktionsfähige Seiten. Die Seiten verfügen über alle Datenbankoperationen (Anzeigen, Einfügen, Bearbeiten und Löschen) sowie über Sortier- und Pagingfunktionen.

  • Integrierte Datenvalidierung auf Grundlage des Datenbankschemas.

  • Für jedes Fremdschlüssel- oder boolesche Feld werden automatische Filter erstellt.

Dynamic Data verwendet URL-Routing, um Anforderungen abzugleichen und zu verarbeiten. Der Gerüstmechanismus leitet die Ansicht und die Tabelle, die ein Benutzer anzeigen möchte, anhand der angeforderten URL her. Der Routingmechanismus bietet den Vorteil, dass die angeforderte URL nicht mit dem physischen Pfad in der Anwendung übereinstimmen muss.

Aktivieren des Gerüstmechanismus

Der Gerüstmechanismus ist standardmäßig deaktiviert. Bei der Aktivierung des Gerüstmechanismus muss mit angemessener Sorgfalt vorgegangen werden, da dieser Anzeige-, Bearbeitungs-, Einfüge- und Löschfunktionen für das gesamte Datenmodell freigibt und somit ein Sicherheitsrisiko birgt.

Folgende Ansätze sind verfügbar, um den Gerüstmechanismus zu aktivieren:

Sie müssen den Datenkontext, der Dynamic Data-Features verwendet, registrieren, selbst wenn Sie den Gerüstmechanismus nicht verwenden möchten. Diese Registrierung wird in der Datei global.asax mit der RegisterContext-Methode vorgenommen. In der RegisterContext-Methode kann ein ContextConfiguration-Objekt als Parameter angegeben werden. Um den Gerüstmechanismus bei der Datenkontextregistrierung zu aktivieren, legen Sie die ScaffoldAllTables-Eigenschaft des ContextConfiguration-Objekts auf true fest. Hierdurch wird der Gerüstmechanismus für das gesamte Datenmodell aktiviert. Folglich stehen alle Tabellen im Datenmodell zum Anzeigen, Bearbeiten, Einfügen und Löschen zur Verfügung. Wenn Sie bestimmte Tabellen aus dem Gerüstmechanismus ausblenden möchten, verwenden Sie das ScaffoldTableAttribute-Attribut.

Das folgende Beispiel veranschaulicht, wie Sie den Gerüstmechanismus für alle Tabellen im Datenmodell aktivieren, während Sie den Datenkontext für die Datenbank AdventureWorksLT registrieren.

model.RegisterContext(GetType(AdventureWorksLTDataContext), _
                      New ContextConfiguration() With {.ScaffoldAllTables = True})
model.RegisterContext(typeof(AdventureWorksLTDataContext),
    new ContextConfiguration() { ScaffoldAllTables = true });

Wenn Sie exakter steuern möchten, welche Tabellen verfügbar gemacht werden, können Sie mit dem ScaffoldTableAttribute-Attribut den Gerüstmechanismus für eine bestimmte Tabelle aktivieren bzw. deaktivieren. Anstatt das gesamte Datenmodell zur Verfügung zu stellen und die Tabellen auszublenden, die Sie nicht freigeben möchten, können Sie auch nur die von der Anwendung benötigten Tabellen verfügbar machen. Um das ScaffoldTableAttribute-Attribut anzuwenden, müssen Sie eine partielle Klasse mit dem gleichen Namen wie die Entitätsklasse im Datenmodell erstellen und das Attribut auf die partielle Klasse anwenden.

Das folgende Beispiel veranschaulicht, wie Sie den Gerüstmechanismus für eine einzelne Tabelle aktivieren.

Imports System.ComponentModel.DataAnnotations

<ScaffoldTable(True)> _
Partial Public Class Product
End Class
using System.ComponentModel.DataAnnotations;

[ScaffoldTable(true)]
public partial class Product {
}

Wenn Sie exakter steuern möchten, welche Datenfelder verfügbar gemacht werden, können Sie mit dem ScaffoldColumnAttribute-Attribut den Gerüstmechanismus für ein bestimmtes Datenfeld aktivieren bzw. deaktivieren.

Standardmäßig werden nicht alle Datenfelder von Dynamic Data angezeigt. Im Folgenden werden einige wichtige Regeln genannt, anhand derer Dynamic Data bestimmt, ob ein Datenfeld angezeigt wird:

  • Wenn ein ScaffoldColumnAttribute-Attribut auf das Datenfeld angewendet wurde, wird das Datenfeld angezeigt. Diese Regel setzt alle folgenden Regeln außer Kraft.

  • Wenn ein UIHintAttribute-Attribut auf das Datenfeld angewendet wurde, wird das Datenfeld angezeigt. Diese Regel setzt alle folgenden Regeln außer Kraft.

  • Wenn ein Datenfeld ein Fremdschlüsselfeld ist, wird es nicht angezeigt. Der Grund hierfür ist, dass Dynamic Data Fremdschlüsselfelder auf andere Weise verarbeitet und den Wert für das Fremdschlüsselfeld in der Regel nicht anzeigt.

  • Wenn das Datenfeld in der Datenbank automatisch generiert wurde, wird es nicht angezeigt. Diese Art von Feld enthält in der Regel keine relevanten Informationen. Stellen Sie sicher, dass das UIHintAttribute-Attribut auf das Datenfeld angewendet wird, wenn das Datenfeld angezeigt werden muss.

Wenn der Wert der IsCustomProperty-Eigenschaft auf true festgelegt ist, wird das Datenfeld nicht angezeigt.

Um das ScaffoldColumnAttribute-Attribut anzuwenden, müssen Sie eine zugeordnete Metadatenklasse erstellen, in der Sie das ScaffoldColumnAttribute-Attribut auf die Datenklasse anwenden. Darüber hinaus müssen Sie eine partielle Klasse mit dem gleichen Namen wie die Entitätsklasse im Datenmodell erstellen. Anschließend müssen Sie diese zwei Klassen zuordnen, indem Sie das MetadataTypeAttribute-Attribut auf die die partielle Klasse anwenden.

Das folgende Beispiel veranschaulicht, wie Sie bestimmte Datenfelder (PasswordHash und PasswordSalt) aus dem Gerüstmechanismus ausblenden.

Imports System.ComponentModel.DataAnnotations

<MetadataType(GetType(Customer_Metadata))> _
Partial Public Class Customer

End Class

Public Class Customer_Metadata
    <ScaffoldColumn(False)> _
    Public PasswordHash As Object

    <ScaffoldColumn(False)> _
    Public PasswordSalt As Object
End Class
using System.ComponentModel.DataAnnotations;

[MetadataType(typeof(Customer_Metadata))]
public partial class Customer
{
}

public class Customer_Metadata
{
    [ScaffoldColumn(false)]
    public object PasswordHash;

    [ScaffoldColumn(false)]
    public object PasswordSalt;
}

Seitenvorlagen

Der ASP.NET Dynamic Data-Gerüstmechanismus verwendet Vorlagen, um die Standardansicht der Daten bereitzustellen. Bei diesen Vorlagen handelt es sich um reguläre ASP.NET-Seiten, sodass Sie die Vorlagen bearbeiten und die Darstellung und das Verhalten der generierten Seiten in der gesamten Webanwendung anpassen können.

Wenn Sie eine ASP.NET Dynamic Data-Anwendung erstellen, wird durch die Projektvorlage dem Projekt ein Dynamic Data-Ordner hinzugefügt. In der folgenden Tabelle sind die von Dynamic Data im Ordner DynamicData\PageTemplates bereitgestellten Seitenvorlagen aufgeführt:

Name der Seitenvorlage

Beschreibung

Details.aspx

Stellt eine detaillierte Ansicht einer einzelnen Zeile in der Datenbank bereit. Zum Anzeigen der Daten wird ein DetailsView-Steuerelement verwendet. Dies ist die Standardvorlage, die für Auswahloperationen verwendet wird.

Edit.aspx

Stellt eine Schnittstelle zum Bearbeiten einer einzelnen Zeile einer Datenbanktabelle bereit. Zum Bearbeiten der Daten wird ein DetailsView-Steuerelement verwendet. Dies ist die Standardvorlage, die für Bearbeitungsoperationen verwendet wird.

Insert.aspx

Stellt eine Schnittstelle zum Einfügen einer einzelnen Zeile in eine Datenbanktabelle bereit. Zum Einfügen der Daten wird ein DetailsView-Steuerelement verwendet. Dies ist die Standardvorlage, die für Einfügeoperationen verwendet wird.

List.aspx

Zeigt eine Liste der Zeilen in einer Datenbanktabelle an. Es werden DropDownList-Steuerelemente zum Filtern der Daten für jede Fremdschlüsselspalte oder boolesche Spalte sowie für Sortier- und Pagingfunktionen bereitgestellt. Für die Liste der Zeilen wird ein GridView-Steuerelement verwendet. Dies ist die Standardvorlage, die für Anzeigeoperationen verwendet wird.

ListDetails.aspx

Zeigt eine Liste der Zeilen in einer Datenbanktabelle an. Es werden DropDownList-Steuerelemente zum Filtern der Daten für jede Fremdschlüsselspalte oder boolesche Spalte sowie für Sortier- und Pagingfunktionen bereitgestellt. Die Vorlage verwendet für die Liste der Zeilen ein GridView-Steuerelement und für die ausgewählte Zeile sowie zum Einfügen eines neuen Datensatzes ein DetailsView-Steuerelement. Diese Vorlage bietet eine umfassende Funktionalität. Die Vorlage wird standardmäßig nicht verwendet, Sie können jedoch die Konfiguration in der Datei Global.asax ändern, um diese Vorlage zu nutzen.

Alle von Dynamic Data bereitgestellten Standardvorlagen verfügen über die folgenden Features:

  • Sie verwenden eine Masterseite mit dem Namen Site.master, die im Stammordner gespeichert ist. Die Masterseite definiert Stylesheets und einen Basisheader und beinhaltet zudem ein ScriptManager-Steuerelement, um AJAX-Funktionalität auf der Website zu aktivieren. Für Debugvorgänge können Sie die Aktualisierung der partiellen Seite deaktivieren, indem Sie die EnablePartialRendering-Eigenschaft des ScriptManager-Steuerelements auf false festlegen. Weitere Informationen hierzu finden Sie unter Hinzufügen von AJAX- und Clientfunktionen.

  • Jede Seitenvorlage enthält ein UpdatePanel-Steuerelement, um Teilrendering ohne Postback zu aktivieren. Weitere Informationen hierzu finden Sie unter Deklarative Syntax des UpdatePanel-Webserver-Steuerelements.

  • Darüber hinaus enthält jede Seitenvorlage ein DynamicDataManager-Steuerelement, um den datengebundenen Steuerelementen und Datenquellensteuerelementen in der Vorlage dynamisches Verhalten hinzuzufügen.

Anpassen der Seitenvorlagen

Dynamic Data ermöglicht Ihnen, die bereitgestellten Vorlagen anzupassen. Hierfür stehen zwei Möglichkeiten zur Verfügung:

  • Anpassen der integrierten Seitenvorlagen.

  • Anpassen des Layouts einer bestimmten Tabelle.

Sie passen die integrierten Seitenvorlagen an, indem Sie die im Ordner DynamicData\PageTemplates gespeicherten Seiten bearbeiten. Die in diesem Ordner vorgenommenen Änderungen wirken sich auf die Darstellung und das Verhalten der generierten Seiten aus, die den Gerüstmechanismus in der gesamten Webanwendung nutzen.

Sie können auch den Gerüstmechanismus verwenden und benutzerdefinierte Seiten für bestimmte Tabellen erstellen. Erstellen Sie hierzu im Ordner DynamicData\CustomPages einen Unterordner mit dem gleichen Namen wie die Entitätstabelle im Datenmodell. Fügen Sie dann in diesem neuen Ordner eine Seite mit dem gleichen Namen wie die global verwendete Seitenvorlage hinzu. Wenn Sie beispielsweise eine spezielle Detailseite für eine Tabelle erstellen möchten, geben Sie als Namen für die Seite Details.aspx an. Sie können die integrierte Seitenvorlage als Grundlage für die benutzerdefinierte Seite verwenden. Ein Beispiel finden Sie unter Gewusst wie: Anpassen des Layouts einer einzelnen Tabelle mit einer benutzerdefinierten Seitenvorlage.

Anpassen der Routen

Wie bereits erwähnt, verwendet Dynamic Data ASP.NET-Routing, um URL-Anforderungen abzugleichen und zu verarbeiten. Die Routen sind in der Datei global.asax definiert. Standardmäßig verwendet Dynamic Data für jede Operation (Anzeigen, Auswählen, Bearbeiten und Einfügen) eine andere Seitenvorlage. Die Löschfunktion wird sowohl in Listen- als auch in Detailseiten angezeigt, da für Löschvorgänge keine spezifische Seitenvorlage erforderlich ist.

Sie können die Routen anpassen, sodass diese andere URLs anzeigen. Sie können die Routen jedoch auch verwenden, um andere Seitenvorlagen anzugeben, die Dateierweiterung aus der URL zu entfernen oder Parameter mithilfe von Routen anstelle von Abfragezeichenfolgenwerten zu übergeben. Weitere Informationen zu Routen finden Sie unter ASP.NET-Routing.

Im folgenden Beispiel wird veranschaulicht, wie Sie angeben, dass die Routen eine einzelne Seitenvorlage für alle Operationen verwenden sollen. Die erste Route aktiviert alle Operationen in einer Seite für eine bestimmte Tabelle. Die zweite Route ermöglicht, dass eine Seite die Details zu einem Datensatz aufruft, z. B. indem für ein Fremdschlüsselfeld zu einer Beziehungstabelle navigiert wird.

routes.Add(New DynamicDataRoute("{table}/ListDetails.aspx") With { _
  .Action = PageAction.List, _
  .ViewName = "ListDetails", _
  .Model = model})

routes.Add(New DynamicDataRoute("{table}/ListDetails.aspx") With { _
  .Action = PageAction.Details, _
  .ViewName = "ListDetails", _
  .Model = model})
routes.Add(new DynamicDataRoute("{table}/ListDetails.aspx")
{
    Action = PageAction.List,
    ViewName = "ListDetails",
    Model = model
});

routes.Add(new DynamicDataRoute("{table}/ListDetails.aspx")
{
    Action = PageAction.Details,
    ViewName = "ListDetails",
    Model = model
});

Sie können zudem spezielle Routen für bestimmte Tabellen erstellen, indem Sie eine andere Seitenvorlage als für die anderen Tabellen angeben. Die Routen werden in der Reihenfolge analysiert, in der sie definiert wurden. Sie müssen daher zuerst die spezifischeren Routen und dann die allgemeinen Routen definieren.

Das folgende Beispiel veranschaulicht, wie Sie eine andere Seitenvorlage für die Tabelle Products der Datenbank AdventureWorks angeben und anschließend eine allgemeine Vorlage für die anderen Datenbanktabellen definieren.

routes.Add(New DynamicDataRoute("Products/{action}.aspx") With { _
  .ViewName = "ListDetails", _
  .Table = "Products", _
  .Model = model})

routes.Add(New DynamicDataRoute("{table}/{action}.aspx") With { _
  .Constraints = New RouteValueDictionary( _
    New With {.Action = "List|Details|Edit|Insert"}), _
  .Model = model})
routes.Add(new DynamicDataRoute("Products/{action}.aspx")
{
    ViewName = "ListDetails",
    Table = "Products",
    Model = model
});

routes.Add(new DynamicDataRoute("{table}/{action}.aspx")
{
    Constraints = new RouteValueDictionary(
      new { action = "List|Details|Edit|Insert" }),
    Model = model
});

Siehe auch

Konzepte

Übersicht über ASP.NET Dynamic Data

ASP.NET-Routing