Freigeben über


Dieser Artikel wurde maschinell übersetzt.

.NET RIA-Services

Erstellen ein datengesteuertes Ausgaben Anwendung mit Silverlight 3

Jonathan Carter

Codedownload von der MSDN-Code-Katalog
Den Code Online durchsuchen

Dieser Artikel basiert auf einer Vorabversion von .NET RIA-Services. Allen Informationen sind vorbehalten.

In diesem Artikel werden die folgenden Themen behandelt:

  • Erste Schritte mit .NET RIA-Services
  • Datendienste und Domäne-Vorgänge
  • Code-Projektion
  • Flexible Datensteuerelemente
In diesem Artikel werden folgende Technologien verwendet:
Silverlight-3, .NET RIA-Services, WPF

Inhalt

Einführung
Daten-Services-Bibliothek
Domäne-Vorgänge
Code-Projektion
Daten-Steuerelemente
ObjectDataSource-Klasse
DataPager
DataForm
Die Metadaten
Überprüfung
Freigegebene Code
Umbrechen von

sind in der Softwareentwicklung, gibt es viele verschiedene Arten von Anwendungen, von die jedes eine eigene Zweck und Anforderungen, Stärken und Schwächen Lieferumfang. Beim Auswählen einer Entwicklungsplattform oder framework wird Teil der Entscheidung wahrscheinlich verwenden, ob das framework problemlos die Art der Anwendung gesuchten aktivieren kann erstellen. Möchte, dass keine Entwickler Stunden schreiben Sanitär- oder Infrastruktur-code zu verbringen, und möchte, dass kein Kunde bezahlen für diese Art der Arbeit ausgeführt werden. Ist in erster Linie auf Geschäftsanforderungen konzentrieren wichtig, daher ist eine Entwicklungsplattform, die besser ermöglicht zusammenstellen und erhöht die Produktivität müssen ein absoluten muss.

Silverlight ist eine großartige-Technologie für das Erstellen attraktiver Webanwendungen. Während der Silverlight-2.0 eine Teilmenge von Windows Presentation Foundation (WPF) enthält, wurde keine ausgeglichene Menge an die Funktionen in WPF, die es einfacher, datengesteuerte Anwendungen erstellen vorgenommen übernommen. Dies verursachte viele Entwickler schließlich auf übergeben Sie Silverlight verwenden, da es zu viel Arbeit zum Implementieren von der Infrastruktur datenzentrischer anspruchsvollere Weblösungen benötigt würde. Als Teil der Silverlight-3-Version werden neue Steuerelemente und features eingeführt wird, die speziell datengesteuerte Anwendungen entwickeln erleichtern. Dies umfasst neue Datensteuerelemente, navigation, Überprüfung und Dialogfeld windows eingebettet.

Während diese clientseitige Erweiterungen eine umfangreiche Datenmenge Wert auf Ihre eigenen, Silverlight Bereitstellen einer mehrstufigen Umgebung ist und daher erfordert Kenntnisse der Behandlung von client-server-Kommunikation. Um dieses problem zu lösen, bietet .NET RIA Services (mit dem Codenamen " Alexandria") eine Reihe von Serverkomponenten und ASP.NET-Erweiterungen, die den n-tier-Entwicklungsprozess erleichtern vereinfachen Ihrer Anwendungen fast so entwickeln Sie auf eine einzige Ebene ausgeführt werden. Darüber hinaus werden Dienste wie Authentifizierung, Rollen und Profil Verwaltung bereitgestellt. Die Kombination von Client- und Verbesserungen an der Silverlight-3 und ASP.NET, zusammen mit den .NET RIA-Services, Optimieren der end-to-end-Erfahrungen von Entwickeln datengesteuerter Webanwendungen, auch bekannt als Rich Internet Applications oder RIAs.

fig01.gif

Abbildung 1 Standard .NET RIA Services-Projekt

In diesem Artikel werde ich zeigen wie die Verbesserungen in Silverlight-3, in Verbindung mit der Funktionalität von .NET RIA-Services, eingeführt Sie eine umfassende Umgebung für die Entwicklung von datenzentrischen Webanwendungen zuweisen. Um am besten die Funktionen zu verdeutlichen, die Silverlight-3 und .NET RIA Services bereitstellen, werde ich Erstellen von einer Spesenabrechnung Nachverfolgen der Anwendung, die die neuen Featuregruppen nutzen wird. Die Anwendung ermöglicht Mitarbeitern anmelden, verwalten und erstellen Ihre persönlichen Spesenabrechnungen. Nach Abschluss eine Spesenabrechnung können Sie dann, gesendet werden mit ausstehender Genehmigung von einem manager.

Einführung

Nachdem Sie .NET RIA-Services und Silverlight-3 installiert haben, enthält Visual Studio, eine neue Projekt-Vorlage Silverlight Data Application zur erhalten Sie aufgerufen und schnell ausgeführt. Wenn Ihre Lösung erstellt wird, sind Sie mit zwei Projekten angezeigt: ein Silverlight-Projekt und ein ASP.NET project (siehe Abbildung 1 ). Das Silverlight-Projekt darstellt Ihrer Clientanwendung, und das Projekt ASP.NET die back-end-Logik enthält.

Was ist der Vorteil dieser Standard-Projektstruktur? Wie weit die bereitgestellten Silverlight wechselt Projekt, es an die Sie ist identisch mit what you get würden, wenn Sie einem normalen Silverlight-Projekt erstellt. Sie haben eine standard-App.xaml-Datei und eine Standardseite. Es gibt jedoch geringfügige Unterschiede zu diesem Projekt Silverlight, das die Entwicklung Ziele unterstützen wird.

Das Projekt ASP.NET ist ebenfalls einfach, aber wenn Sie innerhalb der default.aspx-Seite ansehen, Sie werden bemerken, dass es macht Verwendung von einem neuen server-Steuerelementen als SilverlightApplication bezeichnet.

<ria:SilverlightApplication 
  ID="Xaml1" runat="server" 
  Source="~/ClientBin/ExpenseReports.xap" 
  MinimumVersion="1.0" 
  Width="100%" Height="100%" />

Dieses Steuerelement soll der Vorgang, hostet eine Silverlight-Anwendung in einer ASP.NET WebForms Anwendung einfacher zu stellen. Das SilverlightApplication-Steuerelement ist bereits konfiguriert auf der XAP abzuzielen, die aus dem Silverlight-Projekt erstellt werden.

Zu diesem Zeitpunkt haben Sie eine vollständig funktionale und gehostete Silverlight-Anwendung. Jetzt müssen Sie lediglich mit dem Hinzufügen von benutzerdefinierten Geschäftslogik und BENUTZEROBERFLÄCHE beginnen möchten.

Angenommen, Sie bereits verfügen haben eine Datenbank an Ort für diese Anwendung, daher möchten als nächste ein ADO.NET Entity-Datenmodell das server-Projekt hinzufügen. Ich werde werden verwenden Entity Framework als Objektrelationale Zuordnung (O/RM) in diesem Artikel, aber Sie können auch die LINQ to SQL, NHibernate, herkömmlichen ADO.NET oder eine andere Daten-access-Methode verwenden.

Das Datenmodell ist sehr einfach, mit nur drei Entitäten: ExpenseReport, ExpenseReportDetail, und der Mitarbeiter (siehe Abbildung 2 ). Weitere Informationen zu denADO.NET Entity Frameworkauf der MSDN-Website.

fig02.gif

Abbildung 2 Datenmodus

Mit dem Datenmodell und O/RM Auswahl können Sie jetzt beginnen, die back-end-Logik implementieren. Da dieses Projekt Silverlight als client und ASP.NET als die Host verwendet, müssen Sie einen Ansatz für die Kommunikation zwischen den zwei Ebenen festlegen. Sie können jede Frameworks aktuell Kommunikation wie Windows Communication Foundation (WCF) oder ADO.NET Data Services, abhängig von Ihren Anforderungen verwenden.

Daten-Services-Bibliothek

.NET RIA Services führt eine Bibliothek Serverkomponenten, data-driven RIAs einfacher erstellen. Die Bibliothek ist nicht auf eine beliebige bestimmte UI-framework benötigen, und während dieser Artikel auf den Verbrauch von Silverlight konzentriert sich, ist nur eine der möglichen Clientoptionen. In Zukunft die Versionen, .NET RIA Services werden auch mit ADO.NET Data Services arbeiten.

.NET RIA Services revolves in erster Linie um eine neue Klasse namens DomainService, die als ein Serverendpunkt für Logik und Daten Modell Geschäftsinteraktion fungiert. Erstellen eine ist ebenso einfach wie das nutzen von .NET RIA Services in Visual Studio installierten Vorlagen Business logic-Klasse.

Ein DomainService kann in zwei Formen vorhanden sein: model–specific von Daten oder generische. Die Daten model–specific Implementierung bricht effektiv ein Datenmodell, sodass Sie die Möglichkeit, eine Kombination von Unternehmen Logik und die Daten den Zugriffscode schreiben. Auf diese Weise mehr bequem, wenn Sie abrufen und schnell in Szenarios, die, in dem Sie bereits ein Datenmodell verfügen, Sie arbeiten möchten, ausgeführt.

Es gibt zwei Daten model–specific DomainService Implementierungen mit .NET RIA Services bereitgestellten: ADO.NET Entity Framework und LINQ to SQL. Wenn Ihre Anwendung verwenden, eine Sie die entsprechende option im Assistenten auswählen können, Erstellung einer DomainService. Wenn Sie einen anderen Typ des Datenmodells oder O/RM verwenden, könnten Sie Ihre eigenen bestimmte Implementierung einer DomainService sowie erstellen.

Für diesen Artikel da es bereits ein Entität-Datenmodell an Stelle werde ich fortfahren und erstellen eine Entität Framework–specific DomainService. Ich erhalte eine neue Klasse, die von LinqToEntitiesDomainService <t> erbt:

[EnableClientAccess]
public class ExpenseService : 
  LinqToEntitiesDomainService<ObjectContext> {

  //public IEnumerable<Employee> GetEmployees()
  //{
  //    return this.Context.Employee;
  //}
}

Stellt der generische parameter dar in diesem Fall die ObjectContext-Instanz, die die Verbindung mit dem Entity-Datenmodell darstellt. Das erste Schritt besteht der Anweisung des Kommentars TODO Beachten und ersetzen Sie den Typ parameter Platzhalter durch die tatsächlichen ObjectContext, in diesem Fall-ExpenseReportContext.

Neben dem erben von DomainService (oder eine Ableitung), einer Domäne kann Dienst über eine EnableClientAccessAttribute zugeordnet haben. Dieses Attribut wird, was eigentlich die Klasse als ein Domäne-Dienst bezeichnet und können Sie angeben, ob Sie öffentlich eingeblendet werden soll. Nach öffentlich verfügbar, es bedeutet Ihrer Clientanwendung zugänglich. Dadurch können Sie die Option, um zu bestimmen, ob auf dem server lediglich einige Logik erforderlich ist oder wenn Sie auch auf dem client verfügbar sein sollen.

Domäne-Vorgänge

Ein Dienst für domain nicht eigenständig sehr nützlich, wenn Sie einige Funktionen in form von Domäne Vorgänge hinzufügen. Ein Domäne-Vorgang stellt einen Endpunkt für den Domäne-Dienst und können zu erstellen, lesen, Aktualisieren und Löschen (CRUD)-Vorgänge für die Datenmodell, Ihre beliebige Geschäftslogik oder beide. Jede Domäne operation muss auf einen bestimmten Vorgangstyp, einschließlich Abfrage, Einfügen, Aktualisieren, Löschen, Dienstvorgang und benutzerdefinierte zuordnen. Die Vorgang Typ Zuordnung kann entweder durch Konvention oder durch Konfiguration auftreten.

Abhängig von der Vorgang-Art der Domäne-Vorgang das durchführen, hat es eine bestimmte Signatur folgen. Zusätzlich haben einige Vorgänge führen Sie eine spezifische Namenskonvention oder ein Attribut, der welche Art von Vorgang bestimmt, die es ist. Beispielsweise ist dies ein Abfragevorgang, und der Rückgabetyp muss entweder IEnumerable <T> oder IQueryable <T> ist, ein Entitätstyp T funktioniert mit. Es kann eine beliebige Anzahl von Parameter, die als Filter dienen können akzeptieren keine sind jedoch erforderlich.

Erstellen einen Domäne-Vorgang zum Abrufen von allen Spesenabrechnungen könnte folgendermaßen aussehen:

public IEnumerable<ExpenseReport> 
  GetExpenseReports() {

  return Context.ExpenseReports;
}

ExpenseReport ist eine Entität im zugrunde liegenden Datenmodell und, daher gültiger Typ zurückgegeben. Die DomainService-Klasse enthält eine Eigenschaft mit der Kontext, die Zugriffe eine Instanz der Datenmodell (Typ Sie als generische parameter angegeben), ermöglicht dem Sie Abfragen in diesem Fall eine Liste aller Ausgaben-Berichte zu können. Dieser Vorgang wird auf einen Typ vom Konvention zugeordnet.

Erstellen eine Daten-Methode zum Abrufen der einer bestimmte Spesenabrechnung könnte folgendermaßen aussehen:

[Query(IsComposable = false)]
public IEnumerable<ExpenseReport> 
  GetExpenseReport(int id) {

  var expenseReport = 
    from rep in Context.ExpenseReports
    where rep.Id == id
    select rep;

  return expenseReport;
}

Beachten Sie, dass es sich bei dieser Datenmethode um einen parameter für eine bestimmte Spesenabrechnung nach ID abrufen verwendet Da Sie Zugriff auf die zugrunde liegenden ObjectContext haben, können Sie auch die Abfrage mithilfe von LINQ schreiben. Diese Methode wird zugeordnet, durch Konfiguration, verwenden die QueryAttribute, der auch Sie zusätzliche Eigenschaften angeben, die conventionally kann nicht erreicht werden kann. Ich werde erwähnen die IsComposable-Eigenschaft des die QueryAttribute weiter unten in diesem Artikel wozu.

Viele Methoden Abfragen, bei Bedarf kann eine DomainService enthalten. Zusätzlich zum Abrufen von Daten, können Sie Vorgänge für Speichern von Daten wieder in das data-Modell erstellen. Implementieren der Dauerhaftigkeit der grundlegenden Vorgänge (Einfügen/Aktualisieren/Löschen) für Spesenabrechnungen könnte folgendermaßen aussehen:

public void InsertExpenseReport(
  ExpenseReport expenseReport) {
  Context.AddToExpenseReports(expenseReport);
}

public void UpdateExpenseReport(
  ExpenseReport current, ExpenseReport original) {
  Context.AttachAsModified(current, original);
}

public void DeleteExpenseReport(
  ExpenseReport expenseReport) {
  Context.DeleteObject(expenseReport);
}

Sie können die Dauerhaftigkeit-Arbeitsgänge für Ausgaben Bericht details in nahezu identisch definieren. Sie können nur eine einzelne Einfügen, Aktualisieren und delete-Methode pro Entitätstyp (ExpenseReport in diesem Szenario), da, wenn eine Anforderung auf die DomainService, um Änderungen wieder an das Datenmodell speichern eingeht, die DomainService, welche Methode zum Aufrufen wissen muss verwenden.

Eine ist zu über diese Vorgänge zu Beachten deren Signaturen. Beim Erstellen von einer insert oder-Methode Delete, müssen einen einzigen parameter, der entspricht dem Typ der Entität dauert die Methode für einfügen oder löschen verantwortlich ist. Wenn Sie eine update-Methode erstellen, muss es dauern, zwei Parameter: die geänderten oder aktuelle Einheit-Instanz und die ursprüngliche Instanz der Entität. Die Methodensignatur in Verbindung mit der Methodenname ist, was auf die DomainService bezeichnet die Methode für die der Vorgang für die Entitätstyp verantwortlich ist.

Die Namenskonvention, die Wenn Dauerhaftigkeit Vorgänge definieren die Methodennamen mit dem Typ des Vorgangs als Präfix verwendet werden können. Beispielsweise, da die Methode DeleteExpenseReport aufgerufen wird, das Präfix löschen bezeichnet, ist eine operation zum Löschen von Konvention. Die Signatur definiert dann welche Entitätstyp (ExpenseReport) zugeordnet ist. Wie Sie erwarten, ist Aktualisierungsvorgänge ist aktualisieren und Vorgänge einfügen das herkömmliche Methode Namen Präfix einfügen. Dies ist Grund, warum es keine zusätzliche Konfiguration für diese Vorgänge arbeiten müssen nicht.

Wenn ein Arbeitsgang nicht die erwartete Namenskonvention folgen oder an zusätzliche Metadaten für den Vorgang (wie es mit der GetExpenseReport-Methode wurde), können Sie Konfiguration-Attribute wie z. B. QueryAttribute, InsertAttribute, DeleteAttribute und UpdateAttribute ausgleichen wie ich mit der GetExpenseReport-Methode.

Wenn es sich bei müssen Sie Geschäftslogik zu definieren, die ist nicht unbedingt mit einem Arbeitsgang CRUD gebunden, aber einen Entitätstyp zugeordnet ist, können Sie einen Dienstvorgang erstellen. In diesem Fall möchten es Vorgänge für Genehmigen und Ablehnen von Spesenabrechnungen. Dies bedeutet einfach nur des Spesenberichts Statuswert ändern (siehe Abbildung 3 ). Die Signatur für einen Dienstvorgang hat sich um eine Instanz der Entität-Typs zu übernehmen, es zugeordnet ist und muss void zurückgeben. Beachten Sie, dass keine Konvention für das Definieren von Dienstvorgängen, damit Sie die ServiceOperationAttribute zum Konfigurieren der entsprechenden Domäne Vorgänge anwenden müssen vorhanden ist.

Abbildung 3-Dienst-Vorgänge

[ServiceOperation]
public void ApproveExpenseReport(
  ExpenseReport expenseReport) {

  if (expenseReport.Status == 1) {
    if (expenseReport.EntityState == 
      System.Data.EntityState.Detached) {
      Context.Attach(expenseReport);
    }
    expenseReport.Status = 2;
  }
}

[ServiceOperation]
public void RejectExpenseReport(ExpenseReport er) {
  if (er.Status == 1) {
    if (er.EntityState == 
      System.Data.EntityState.Detached) {
       Context.Attach(er);
    }
    er.Status = 0;
  }
}

Nun, da Sie den Dienst für die Domäne und die erstellten Arbeitsgänge haben haben, wechseln wie Sie zur Interaktion mit den Dienst über die ASP.NET server Host an die Clientanwendung Silverlight? Wenn Sie WCF oder ADO.NET Data Services verwenden wurden, würde Sie einen Verweis im Silverlight-Projekt erstellen, die an den Dienst gezeigt, die einen proxy generieren möchten. .NET RIA Services bietet eine etwas umfangreichere.

Code-Projektion

Wenn Sie die .NET RIA-Services-Lösung erstellen, musste die Silverlight-Projektdatei einige spezielle MSBuild-tasks hinzugefügt werden soll, die projecting der bestimmte server-Komponenten an den client zu verarbeiten. Wenn Sie einen Domäne-Dienst im ASP.NET Projekt, die ein EnableClientAccessAttribute angewendet wurde erstellen, wird der MSBuild-task dieser Domäne-Dienst für die Silverlight-Anwendung Projekt. (Wenn Sie Ihre Lösung mit der neuen Silverlight Data Application Projekt Vorlage erstellen haben, können Sie manuell eine Silverlight-Projekts und ASP.NET-Projekt in Visual Studio um denselben Effekt zu erzielen verknüpfen.)

Wenn Sie im code-behind der Datei Main.xaml des Silverlight-Projekts betrachten, finden Sie sowohl die ExpenseContext und ExpenseReport. Bei ein Datenprovider eine Clientanwendung Silverlight projiziert wird, ist es nicht mehr eine DomainService (oder Untertyp), aber stattdessen eine DomainContext. In der Tat Wenn der Dienst für domain mit dem Wort Service Suffix ist, wird er durch Kontext bei der Projektion ersetzt (die ist der Grund, warum die ExpenseService-Klasse, die als Ausgaben-Kontext eine im Projekt Silverlight) dargestellt wird). Die DomainContext-Klasse fungiert als ein client-proxy für einen DomainService, und Sie enthält die Logik für die Kommunikation von Anforderungen zwischen den zwei Ebenen erforderlich. Es stellt eine Arbeitseinheit, und kann eine Nummernserie Änderung Sätze, die versucht, eine Entität-Instanz, die es derzeit Überwachung ist, erstellen.

Darüber hinaus werden bestimmte Methoden (Öffentliche Methoden, die Domäne Vorgänge entweder durch Konvention oder Konfiguration als werden) zusammen mit Ihrer übergeordneten Domänendienste projiziert. Der sechs Methode Datentypen, werden nur drei geplante: benutzerdefinierte, Dienst, und Abfragen. Wenn eine Abfrage des Methodennamens Get vorangestellt ist, werden bei der Projektion Get mit vom ersetzt. Angenommen, da es eine Abfragemethode mit dem Namen GetExpenseReports definiert, wird es auf dem client als LoadExpenseReports angezeigt. Die zwei Dienstvorgängen sowie geplante wurden, und es werden als Instanzmethoden auf DomainContext wiedergegeben.

Schließlich werden alle Entitätstypen, die von einer Domäne Vorgang zurückgegeben werden auch projiziert. <expensereport>In meinem Beispiel ist Rückgabetyp für die GetExpense-Berichte-Methode IEnumerable < ExpenseReport >, wird die ExpenseReport Entitätsklasse für den Silverlight-client projiziert. Die voraussichtliche Entität-Klassen erben eine spezielle Klasse namens Entitäten, das Verhalten z. B. das Nachverfolgen von Änderungen, Gültigkeitsprüfung überprüfen und WPF/LINEAR-kompatiblen editability bereitstellt. Aus Sicht-API-die clientseitige Entitätsklasse auf dem server wie die Entität sehen, jedoch enthält zusätzliche Funktionalität, die für die Interaktion mit Silverlight Datensteuerelemente erforderlich ist.

Es sind sehr viel mehr details, die umgebenden code Projektion Verhalten als hier erläutert werden. In diesem Artikel berühren nicht auf viele weitere Szenarios, die möglich ist, einschließlich der Möglichkeit, die die Logik anpassen, die bestimmt, wie eine bestimmte Art von code förmige ist, bevor es an die Clientanwendung projecting sind.

Ich verwende den Begriff code Projektion, da ich denke entsprechend beschrieben, was passiert ist. Die ExpenseService-Klasse ist nicht einfach aus einem Projekt in eine andere kopiert (es wird tatsächlich eine Ausnahme, die weiter unten behandelt). Es wird, strukturierten und in die Clientanwendung als einen leicht zu bedienende proxy geplante untersucht wird. Daher können Sie die Art aus dem Clientebene nutzen, als ob es sich um ein lokales Objekt handelt.

Wo ist der Dienst Geplante domain ausblenden? Das Silverlight-Projekt sieht aus der erstellten Status unverändert. Wenn Sie die Option, um alle Dateien für das Silverlight-Projekt anzuzeigen, aktivieren, sehen Sie die culprit (siehe Abbildung 4 ). Ein Ordner ist genannt Generated_Code erstellt, die alle der code enthält, die aus dem partner server-Projekt projiziert worden ist. Versehen ist zurzeit nur eine einzelne Datei vorhanden, ExpenseReportsServer.g.cs (die " " g steht für generiert), die enthält des code für das gesamte ExpenseReportsServer Projekt und das Basisverzeichnis der ExpenseContext-Klasse.

fig04.gif

Abbildung 4 Code generiert, für das Silverlight-Projekt

Wenn Sie einen neuen Datenprovider erstellen oder eine vorhandene ändern, werden die Änderungen automatisch innerhalb des Silverlight-Projekts, um dem client und server ständig synchron halten aktualisiert. In Szenarien, in dem Dienste für den alleinigen Zweck Unterstützung von Clients mit einer Anwendung erstellt werden, möglich müssen ständig service Proxy während der Entwicklung Aktualisieren einer Schmerz. Subtile Dies, zusätzlich zu der Umstrukturierung während der Projektion, stellt sich heraus ein sehr nützliches feature werden.

Daten-Steuerelemente

So habe ich eine Datenbank, Datenmodell, Dienste und clientseitige Proxys Ort. Nun müssen die BENUTZEROBERFLÄCHE zum Anzeigen und Bearbeiten von Ausgaben Berichtsdaten innerhalb des Silverlight-Clients zu erstellen. Beim Umgang mit datengesteuerte Anwendungen es gibt in der Regel zwei Arten der Methoden für die Anzeige der Daten: tabellarischen und formularbasierte. Beim Umgang mit datengesteuerte RIAs müssen tabellarische und formularbasierte Daten in einer Weise dargestellt werden, die den Benutzer auftreten sehr informativen und produktiver macht.

Silverlight-2 verfügen nicht sehr strenger Unterstützung für die Präsentation tabellarische Daten außerhalb des Felds. Nicht selbst das ListView-Steuerelement (das grundlegende Raster-Präsentation in WPF bereitgestellte) ist in Silverlight, die es etwas schwer business software zu erstellen versucht vorhanden. Silverlight wird später ein DataGrid-Steuerelement, das definitiv geholfen, empfangen, aber viele erforderlichen Funktionen waren fehlen weiterhin. Eigenen Steuerelemente waren verfügbar, z. B. Textfeld-Steuerelement (TextBox), Kombinationsfeld-Steuerelement (ComboBox), -Schaltfläche, Listenfeld-Steuerelement (ListBox) und Optionsfeld aus, die Entwicklung von Formularen möglich gemacht, jedoch gibt es war nicht sichere Unterstützung für andere Verhaltensweisen, die z. B. die Datenüberprüfung und Fehlerberichterstattung erforderlich sind.

Silverlight-3 stellt eine Gruppe aus, der neuen Steuerelemente, die speziell vereinfachen die Erstellung von datenzentrischer RIAs für sind. Diese Steuerelemente umfassen DataGrid, DataForm, DataPager, FieldLabel, DescriptionViewer, ErrorSummary und ChildWindow. Es dauerte DataGrid und DataForm und DataPager um Präsentation von Daten in beiden, tabellarische und formularbasierte Formatvorlagen für mein Beispiel-Anwendung zu aktivieren. FieldLabel, DescriptionViewer und ErrorSummary bieten die dynamische UI, Datenüberprüfung und Fehlerberichterstattung zur reagieren die Dateneingabe zu entwickeln. Schließlich ermöglicht ChildWindow Rich-modale Dialogfelder.

Das DataGrid-Steuerelement, das im Lieferumfang von Silverlight 3 befindet stabile. Unter anderem enthält es reorderable und Veränderbare Spalten, Zeilen gruppieren, inline bearbeiten und Überprüfung. Sie definieren der Spalten im Raster auf zwei Arten angezeigt können: generiert und explizit.

Einem Datenraster, der die AutoGenerateColumns-Eigenschaft auf True festgelegt hat erstellt automatisch eine Spalte für jede Öffentliche Eigenschaft vom Typ an das es gebunden ist, wird die Ausnahme wird, wenn eine Eigenschaft eine BindableAttribute zugeordnet ist, die er gibt nicht bindable, anschließend dem DataGrid wird nicht die eine Spalte erstellen, dafür. Dies ist ein Beispiel wie die neuen Daten-Steuerelemente von Entität Metadaten nutzen.

Wenn Sie explizit die Spalten in einem Datenraster definieren, werden Sie die angezeigten Daten nur die Spalten Bereichsdefinierung, die Sie anzeigen möchten. Dies bietet Sie Kontrolle über die Spaltentypen, ebenso wie Kopfzeilentext und zahlreiche weitere Spalteneigenschaften. Einem Datenraster, die die Spalten zum Anzeigen von Ausgaben Berichtsdaten explizit definiert sieht wie die Abbildung 5 .

Abbildung 5 DataGrid für die Spesenabrechnung

<dataGrid:DataGrid
  x:Name="ExpenseReportDataGrid"
  AutoGenerateColumns="False">
  <dataGrid:DataGrid.Columns>
    <dataGrid:DataGridTextColumn 
      Binding="{Binding Company}" 
      Header="Company" />
    <dataGrid:DataGridTextColumn 
      Binding="{Binding Department}" 
      Header="Department" />
    <dataGrid:DataGridTextColumn 
      Binding="{Binding Description}" 
      Header="Description" />
    <dataGrid:DataGridCheckBoxColumn 
      Binding="{Binding Status}" 
      Header="Approved" />
  </dataGrid:DataGrid.Columns>
</dataGrid:DataGrid>

Die Eigenschaften, die in der Spalte Bindungen angegeben sind finden Sie unter Eigenschaften für die ExpenseReport-Entität. Beachten Sie, dass die Klasse für die Silverlight-Anwendung, wodurch es in der client geplante wurde. Die DataGridTextColumn-Klasse werden die Daten als text im schreibgeschützten Modus und als Textfeld im Bearbeitungsmodus angezeigt. Die DataGridCheckBoxColumn wird ein Feld als Kontrollkästchen in allen Modi anzeigen und drei Status aufzunehmen.

Um einem Datenraster zu füllen legen Sie einfach die ItemSource-Eigenschaft für jedes IEnumerable-Objekt. Erinnern sich, dass wenn ich die Ausgaben-Dienst und die GetExpenseReports-Daten-Methode definiert, der Rückgabetyp IEnumerable <expensereport> befunden. Jetzt muss nur herausfinden, wie den client-proxy für den Datenprovider nutzen, die erstellt wurde.

Bei die ExpenseService-Klasse an die Clientanwendung projiziert wurde, wurde die GetExpenseReports-Methode sowie projiziert, (nach LoadExpenseReports umbenannt wird). Dies bedeutet Sie sollte einfach erstellen eine Instanz des ExpenseService und rufen die LoadExpenseReports-Methode. Obwohl, den richtigen Ansatz nutzen ist, nicht dazu es eigenständig Ergebnissen. Interessanterweise genug, zurück nicht die LoadExpenseReports-Methode nichts. Wie erhalten Sie die Ausgaben Berichtsdaten?

Silverlight erfordert keine Sperren Anrufe asynchron durchgeführt werden, sodass der UI-thread nicht abstürzen. Aus diesem Grund bei .NET RIA Services die Domänendienste an einen client Silverlight-Projekte refactors er alle seine Abfragevorgänge sodass diese nicht mehr nichts zurückgeben. Dies wird erläutert, warum .NET RIA Services Umbenennen wird die Abfrage-Methoden zum Laden anstelle von Get (oder Fetch-Funktion, Suchen, Query, Abrufen, oder wählen Sie aus), vorangestellt werden weil es das Verhalten mehr entsprechend widerspiegelt.

Anstelle der Verwenden einer callback-Methode, der die von den Diensten für .NET RIA generierten Klassen verwenden ein Ereignismodell Benachrichtigungsvorgänge für Sie nach Abschluss ein asynchrones Aufrufs. Daher abonnieren um auf das Laden des eine Abfrageoperation zu reagieren, Sie einfach auf die DomainContext des geladene Ereignis, die ausgelöst wird, sobald alle Abfragevorgang abgeschlossen ist. Da der Ereignishandler in der UI-thread aufgerufen wird, können Sie alle Datenbindung darin ausführen.

Abbildung 6 Spesenabrechnung Daten laden

public partial class Main : Page {
  ExpenseContext _dataContext;

  public Main() {
    InitializeComponent();

    this.Loaded += Main_Loaded;

    _dataContext = new ExpenseContext();
    _dataContext.Loaded += dataContext_Loaded;
  }

  void dataContext_Loaded(object sender, LoadedDataEventArgs e) {
    ExpenseReportDataGrid.ItemsSource = e.LoadedEntities;
  }

  void Main_Loaded(object sender, RoutedEventArgs e)  {
    _dataContext.LoadExpenseReports();
  }
}

fig07.gif

Abbildung 7- Ausgaben-Berichte Raster-BENUTZEROBERFLÄCHE

Nachdem der geladene-Ereignishandler ausgelöst wurde, es gibt zwei Möglichkeiten zum Abrufen der angeforderten Daten: über die LoadedDataEventArgs.LoadedEntities-Eigenschaft oder über eine der Eigenschaften stark typisierte Entität auf Ihre Domänenkontext (z. B. ExpenseContext). Zugreifen auf die Daten über die Ereignisargumente ist der bevorzugte Ansatz dar, da dies garantiert wird, dass Sie nur die Daten erhalten sollen. Jedem Aufruf eine Abfrageoperation, die zurückgegebene Entität Instanzen der Domänenkontext daher hinzugefügt werden Wenn Sie den Inhalt zugreifen werden Sie die Anhäufung von Nachrichten jeder Abfrage, nicht nur die eine erhalten werden Wenn Sie zuletzt durchgeführt.

Implementiert die Logik zum Abrufen von allen Spesenabrechnungen und füllen das Datenraster mit den zurückgegebenen Daten sieht wie die Abbildung 6 . Zu diesem Zeitpunkt sieht unsere datengesteuerte RIA Abbildung 7 .

Zusätzlich zu den werden Daten laden können, enthält die DomainContext-Klasse (und die generierten Untertypen) Methoden zum Verwalten von Nachverfolgen von Änderungen und Dauerhaftigkeit der Daten. Alle Änderungen zu einer Entität, die wurde abgerufen (hinzugefügt oder gelöscht) über eine DomainContext wird nachverfolgt werden. Wenn Sie Änderungen speichern möchten, können Sie einfach die SubmitChanges-Methode aufrufen:

private void SaveChangesButton_Click(
  object sender, RoutedEventArgs e) {
  if (_dataContext.HasChanges) {
    _dataContext.SubmitChanges();
  }
}

Da dem DataGrid inline ermöglicht können bearbeiten, indem Sie standardmäßig alle Ausgaben Bericht Datensätze ändern und klicken Sie auf die speichern-Schaltfläche, um diese auf dem server beibehalten. Wenn die SubmitChanges-Methode aufgerufen wird, die die DomainContext im assembliert einer Änderung für alle von den überwachten Entitäten festgelegt und sendet sie an der entsprechenden DomainService werden. Die DomainService dann decomposes die Menge ändern und ruft den jeweiligen Domäne-Vorgang für jede Entität, die eingefügt, aktualisiert oder gelöscht wurde.

Wenn Sie Daten in das DataGrid-Steuerelement bearbeiten, bietet es, Überprüfung und Fehlerberichterstattung automatisch. Wenn Sie ungültige Daten eingeben, Sie werden werden visuell benachrichtigt eine Erläuterung, was falsch ist (siehe Abbildung 8 ). Dieses feature kommt ohne Konfiguration oder Arbeit auf die. Wie Sie in diesem Artikel später sehen werden, können Sie benutzerdefinierte Gültigkeitsprüfungsregeln auch auf Ihre-Datenmodell definieren, die herausgesucht und durch das Datenraster sichergestellt wird.

fig08.gif

Abbildung 8 DataGrid-Überprüfung

Dieser Ansicht der Berichte Ausgaben ist Ordnung, aber es wäre sehr viel nützlicher um Ausgaben gruppiert nach status anzuzeigen. Auf diese Weise ich sofort die herausfinden kann werden Berichte Genehmigung durch einen manager. Glücklicherweise kann dies problemlos in Silverlight 3 erreicht werden durch diesen code auf die vorhandenen DataGrid-definition anhängen:

<dataGrid:DataGrid.GroupDescriptions>
  <dataGrid:PropertyGroupDescription  
    PropertyName="Status" />
</dataGrid:DataGrid.GroupDescriptions>

Das Ergebnis sieht aus Abbildung 9: .

fig09.gif

Abbildung 9 DataGrid gruppieren

ObjectDataSource-Klasse

Während manche Entwickler imperative Ansatz, die bisher verwendet für die Datenbindung natürlich werden möglicherweise andere wie Datenbindung rein deklarativ wesentlich wie wie Sie mit der ObjectDataProvider in WPF arbeiten möglicherweise ausführen können. Dazu stellt Silverlight 3 das ObjectDataSource-Steuerelement.

ObjectDataSource-Klasse handelt es sich um eine nonvisual Steuerelement, das zum Arbeiten mit DomainContext Typen speziell weiß. Sie können Hilfskonten betrachtet werden als die gesamte Funktionalität bereitgestellt werden, dass der vorherige imperative Ansatz hat jedoch durch Mittel vollständig deklarative (und mehr). Sie erkennen einfach es der DomainContext-Typ, mit denen Sie arbeiten, und die welche die Abfragevorgänge genannt werden soll. " ObjectDataSource " verarbeitet die übrigen.

Sie konnte entfernen Sie alle den code aus dem vorherigen Abschnitt durch ein ObjectDataSource-Klasse ersetzt und es wird automatisch rufen Sie die angegebenen load-Methode:

<ria:ObjectDataSource
  x:Name="ExpenseReportsObjectDataSource"
  DataContextType="ExpenseReports.ExpenseContext"
  LoadMethodName="LoadExpenseReports"
  PageSize="20">
  <ria:ObjectDataSource.Filter>
    <data:FilterDescriptor Member="Department" 
      Operator="IsEqualTo" Value="IT" />
  </ria:ObjectDataSource.Filter>
  <ria:ObjectDataSource.Sort>
    <data:SortDescriptor Member="Status" 
      Direction="Descending" />
  </ria:ObjectDataSource.Sort>
</ria:ObjectDataSource>

Mit dem ObjectDataSource-Steuerelement nicht nur bieten eine deklarative Möglichkeit der Datenbindung, es auch Abfragen zusammensetzbares. Sie können hinzufügen sortieren, gruppieren und Filterausdrücke einer ObjectDataSource-Klasse, ebenso wie Seitengröße, mit denen der Aufruf der Abfragevorgang ausgeglichen werden soll. Das beste darin, dass der ObjectDataSource-Klasse ändern wird die Anforderung an den Domäne-Dienst so dass Sie alle angegebene Sortierung oder Filterung angewendet wird, auf der Serverseite also keine nicht benötigte Daten über das Netzwerk übergeben werden.

Erinnern Sie sich an die IsComposable-Eigenschaft des der DomainOperationAttribute? Dies ist was bestimmt, ob ein Domäne-Vorgang zusätzliche Abfrageparameter, die an Sie übergeben werden die zurückgegebenen Daten zusammensetzbares vornehmen kann. Meine GetExpenseReports-Methode hat nicht die code Sortieren oder Filtern hinzufügen, doch aufgrund aus die Komponierbarkeit von der DomainService und die Tatsache, die der ObjectDataSource-Klasse wie weiß besteht Sie Abfragen, ich kann diese Funktion automatisch erhalten.

" ObjectDataSource " ist tatsächlich ein wrapper für eine Instanz von DomainContext und daher profitiert von dasselbe Verhalten ändern-Überwachung. Es enthält dieselben laden und SubmitChanges Methoden, die DataContext ist, sodass Sie programmgesteuert Sie steuern, wie ein DomainContext.

DataPager

Da die Menge der aktuell im Raster angezeigten Daten ein wenig aufwendig ist, wird es möglicherweise für diese Präsentation Zwecken über Pager sinnvoll. Während das DataGrid-Steuerelement Auslagerungsdatei Verhalten hinzugefügt wird nicht, stellt Silverlight 3 ein neues DataPager-Steuerelement, das problemlos mit anderen Datensteuerelemente problemlos Auslagerungsdatei zusammen mit diese Funktionalität arbeitet.

Das DataPager-Steuerelement stellt die erforderliche BENUTZEROBERFLÄCHE Auslagern einfach durch eine angegebene Datenquelle. Wenn Sie einen DataPager an dieselbe Datenquelle als ein anderes Daten-Steuerelement (z. B. DataGrid) binden, wird Auslagern durch die Daten über die DataPager auch die angezeigten Daten in der gebundenen Steuerelementen Seite. Der code, der Liste der Ausgaben-Berichte eine DataPager hinzugefügt könnte folgendermaßen aussehen:

<data:DataPager
  Source="{Binding Mode=TwoWay, Source={StaticResource ExpenseReportDataSource}, Path=Data}"/>

fig10.gif

Abbildung 10 DataPager platzierte auf die unten von einem Datenraster

Beachten Sie, dass es müssen lediglich definieren des Steuerelements und Binden an die richtige Quelle und das Steuerelement die übrigen (siehe verarbeitet Abbildung 10 ).

Die DataPager hat zahlreiche Modi, aus denen Sie auswählen können, die unterscheiden, wie Sie die verfügbaren Seiten für dem Benutzer bietet. Darüber hinaus können Sie vollständig re-skin der DataPager um jedoch Sie gern und dabei weiterhin die bestehende Funktionalität zu suchen.

Während der DataGrid und DataPager eine hervorragende inline bearbeiten Erfahrung bereitstellen, möchten was geschieht, wenn Sie Daten in ein Formularbasiertes layout anzeigen? Zum Erstellen oder Ändern von Spesenabrechnungen, möchten Sie den Benutzer mit einer intuitiven Formular mit statt auf das Raster verlassen anbieten. Für die können Sie das neue DataForm-Steuerelement verwenden.

DataForm

Das DataForm-Steuerelement erlaubt Ihnen, eine Gruppe von Feldern zu definieren, die in einem formularbasierte layout angezeigt, und können an entweder eine juristische Person-Instanz oder eine Auflistung gebunden werden. Arbeiten mit Daten in schreibgeschützte können, einzufügen und zu Modi, mit der Möglichkeit, die Darstellung der einzelnen anpassen bearbeiten. Sie können optional anzeigen, Steuerelemente zum Wechseln zwischen Modi und, wenn an eine Auflistung gebunden, die DataForm auch einen pager für die navigation anzeigen kann. Genau wie das Datenraster DataForm auch ist in verschiedenen Formularen: generierten, explizit, und Vorlage.

Der generierte Modus funktioniert genauso wie DataGrid. Es wird ein Feld und Bezeichnung bestehendes Schlüsselpaar für jede Öffentliche Eigenschaft von der Art erstellt, es an gebunden ist. DataForm respektiert die BindableAttribute, dem Sie die bindable Feldliste auf der Ebene der Entität definieren kann. Definieren eine Bearbeitungsformular für Spesenabrechnungen könnte so einfach wie das sein:

<dataControls:DataForm
  x:Name="ExpenseReportDataForm" Header="Expense Report"
  ItemsSource="{Binding Source={StaticResource ExpenseReportsObjectDataSource}, Path=Data}" />

Verwenden Sie den generierten Modus, sind Sie der DataForm damit alle BENUTZEROBERFLÄCHE Annahmen, die anhand der Metadaten für die Entität zulassen. Das daraus resultierende Formular wird in Abbildung 11 dargestellt.

fig11.gif

Abbildung 11 DataForm-abgeleitete Ausgaben Eingabemaske

Beschriftungen fett für alle erforderlichen Felder (Eigenschaften mit erforderlich-Attribut gekennzeichnet) in angezeigt werden, der die Anforderung an den Benutzer angibt. Rechts neben der Eingabesteuerelementen, enthält der Glyphe Informationen darüber hinaus eine Maus-over-QuickInfo-Beschreibung der die erwartete Eingabe. Eine Beschreibung ist optional und wird durch untersuchen abgerufen, an, ob die Eigenschaft des Felds entsprechende ein DescriptionAttribute angefügt verfügt. Diese sind zwei weitere Beispiele wie der neuen Silverlight-3-Daten-Steuerelemente datengesteuerte Szenarios zu, Aktivieren indem Sie in Ihrer BENUTZEROBERFLÄCHE in Reaktion auf Metadaten auf die data-Modelle.

Genau wie das Datenraster bietet die DataForm auch, Datenüberprüfung und Fehlerberichterstattung. Die zwei Steuerelemente haben eine konsistente Darstellung und-Funktionen enthält für eine allgemeine gute Benutzererfahrung unabhängig von der Präsentation der Daten haben müssen.

Verwenden des Formulars explizite können können Sie welche Felder sollen, welche Art von Felder verwendet werden, anzeigen und welche Beschriftung-text an (unter anderem) deklarieren. Dieses Formular ist nützlich, wenn Sie nicht die UI-Erstellung bis zu den Metadaten DataForm und Entität lassen möchten. Deklarieren eine DataForm explizit sieht wie die Abbildung 12 .

Abbildung 12 explizite Erstellung von ein DataForm

<dataControls:DataForm
  x:Name="ExpenseReportDataForm"
  ItemsSource="{Binding Source={StaticResource ExpenseReportsObjectDataSource}, Path=Data}"
  AutoGenerateFields="False">
  <dataControls:DataForm.Fields>
    <dataControls:DataFormTextField 
      Binding="{Binding Company}" Label="Company" />
    <dataControls:DataFormTextField 
      Binding="{Binding Department}" Label="Department" />                
    <dataControls:DataFormTextField 
      Binding="{Binding Description}" Label="Description" />
    <dataControls:DataFormCheckBoxField 
      Binding="{Binding Status}" Label="Approved" />
  </dataControls:DataForm.Fields>
</dataControls:DataForm>

Zusätzlich zur Felder text und die Kontrollkästchen stehen Felder zur Verfügung für Datum, das Kombinationsfeld, Vorlage, Trennzeichen, Kopf- und Feldgruppe. Mit diesen können Sie die Felder, die Sie anzeigen möchten und grundlegende Anweisung zum Anzeigen der Sie die DataForm erteilen, explizit definieren. Trotz dieser Flexibilität Du noch eingeschränkte an einer Anfang - Formular, wobei jedes Feld einem herkömmlichen ist Beschriftung und Eingabe zu steuern Paar. Während der DataFormTemplateField Sie einen Vorlage für alle Modi (anzeigen und bearbeiten) definieren kann, ist es auf der Feldebene beschränkt. Was geschieht, wenn wollten Sie Vorlage das gesamte Formular?

Wenn vollständige Kontrolle über die BENUTZEROBERFLÄCHE ist erforderlich (oder Bedarf), kann die DataForm Sie Vorlagen für benutzerdefinierte Daten für jedes der Modi (anzeigen, einfügen und bearbeiten) zu definieren. Diese Möglichkeit Sie außerhalb des Standardformats top-down-Formular unterbrechen und den Blick sinnvoll für Ihre situation zu erstellen.

Bestimmte Verhalten ist global auf alle drei Formulare die DataForm wie navigation, Überprüfung und Fehlerberichterstattung. Wenn Sie die Datenvorlagen für die jedoch neu definieren, verlieren Sie den automatische Feld Bezeichnung und Beschreibung viewer, der mit der Modellmetadaten. Beim Entwickeln einer datengesteuerten Anwendung, wäre ein shame dies hilfreich verloren gehen, nur weil mussten Sie Ihr layout anpassen. Glücklicherweise sind die Steuerelemente, werden intern von der dataform und bieten dadurch, auch verwendbare manuell.

Die Metadaten

Wenn Sie die DataForm, um die Liste der Felder zur generieren zulassen, automatisch vereinfacht verwenden Sie zwei Steuerelemente, um das Verhalten Bezeichnung und Beschreibung zu bereitzustellen: FieldLabel und DescriptionViewer. Diese Steuerelemente sind einfach zu verwenden und können in jeder datengebundene Szenario einschließlich benutzerdefinierte DataForm-Vorlagen eingesetzt werden.

FieldLabel ist nützlich, wenn Sie eine Beschriftung für ein Steuerelement zu anzuzeigen, die aus den Metadaten der die zugeordneten gebundene-Eigenschaft festgelegt werden möchten. Der für das Etikett verwendeter text wird von der Name-Eigenschaft des der DisplayAttribute, die es an gebunden ist-Eigenschaft zugeordnet sind abgeleitet. Darüber hinaus, wenn die Eigenschaft erforderlich ist (indem Sie eine RequiredAttribute, die als true zugeordnet gekennzeichnet angezeigt), wird der text im Feld Bezeichnungsfeld in Fettschrift sein.

Neben der werden können einen benutzerdefinierten Namen mit den DisplayAttribute angeben, können Sie eine Beschreibung für eine Eigenschaft festlegen. Wenn Sie eine Beschreibung des anzeigen möchten, können Sie das DescriptionViewer-Steuerelement, das dies automatisch für Sie behandelt. Es wird ein Glyphe Informationen angezeigt, die eine QuickInfo, die Beschreibung der Eigenschaft zugeordneten enthält bereitstellt.

Mit den Steuerelementen FieldLabel und DescriptionViewer können Sie benutzerdefinierte Datenformulare entwickeln, die Metadaten aus Ihrem Datenmodell, nutzen ohne Informationen (z. B. Namen und Beschreibungen) zu replizieren. Sie diese Steuerelemente in Ihrer Anwendung verwenden, angezeigt jederzeit eine Änderung an einer Eigenschaft name, Beschreibung und erforderlichen status (auf das Modell Ebene) vorgenommen wird die BENUTZEROBERFLÄCHE automatisch die Änderung aufgrund der Abhängigkeit Datenmodell. Dies ist der Typ Verhalten, die Sie beim Entwickeln von datengesteuerten Anwendungen erwarten würden.

Überprüfung

Da wir auf die Entwicklung von datengesteuerten Anwendungen konzentrieren, möchten wir unsere Geschäftslogik und die Gültigkeitsprüfung nahe Datenmodell beibehalten. Bei Verwendung von .NET RIA-Services bringen Sie Prüfungslogik auf zwei Arten: Daten Anmerkungen und benutzerdefinierte/freigegeben-Logik.

Die SP1-Version von Microsoft .NET-Framework 3.5 eingeführt, eine Reihe von Attributen bezeichnet Anmerkungen für Daten, die Metadaten sowie Validierungsregeln definieren ein Datenmodell zuordnen. Diese Anmerkungen wurden ursprünglich von ASP.NET Dynamic Data und verstanden werden und von .NET RIA-Services und die neuen Silverlight-3 Datensteuerelemente eingehalten. Sie können Sie solche Überprüfung Aspekte Länge der Zeichenfolge, Bereich, Datentyp und Einschränkungen der regulären Ausdruck angeben:

[Bindable(true, BindingDirection.TwoWay)]
[Display(Name = "Expense Amount", 
  Description = "The amount of the incurred expense.")]
[Range(0.0, 1000000.00)]
public object Amount;

[Bindable(true, BindingDirection.TwoWay)]
[Display(Name = "Category", 
  Description = "The category of expense, i.e., mileage.")]
[StringLength(10)]
public object Category;

Wenn die Projektion .NET RIA Services führt verarbeiten, können Sie einen Punkt, an den client Anmerkungen Serverdaten-Seite geleitet. Solange Sie die allgemeinen Daten Anmerkungen zur Darstellung von Validierungsregeln auf Ihrem server-side--Datenmodell nutzen, wird diese Überprüfung), über für die Silverlight-Anwendung ausführen und vollständig von Beachten Steuerelementen (DataForm, DataGrid, FieldLabel usw.) verwendet werden. Dadurch können effektiv Sie Client- und Überprüfung.

Verwenden die Anmerkungen Daten einfach ist, aber Sie können nicht alle möglichen Überprüfung-Anforderung express. In der Tat können Sie nur die gebräuchlichsten Szenarien wirklich darstellen. In anderen Situationen sehr wahrscheinlich müssen Sie die Überprüfung imperativ definieren. Obwohl dies einfach zu tun ist, kann nicht der .NET RIA Services Projektion Prozess nur Ihre benutzerdefinierte Logik an den client fließen, diesen Prozess auf die Erstellung der DataContext und Entität Proxyklassen beschränkt ist.

Sie können die benutzerdefinierte Logik auf dem server speichern und einen Dienst zu von den Silverlight-client zu aufrufen, aber, Beenden der Anwendung Reaktionsfähigkeit würde und die entfernen Sie der Möglichkeit für die Steuerelemente Daten um Gültigkeit von Daten automatisch zu bestimmen. Sie können Kopieren und fügen Sie die Logik an den client und manuell Ausführen der Überprüfung auf beiden Ebenen, jedoch code Replikation ist nicht empfehlenswert, und das automatische Überprüfung problem würde weiterhin vorhanden. Dies ist ein Szenario, das die Verwendung der gemeinsam genutzten code-feature von .NET RIA Services rechtfertigt.

Freigegebene Code

Für die Ausgaben Bericht Anwendung, es müssen zwei benutzerdefinierte Gültigkeitsprüfungsregeln wird sichergestellt: alle export-Bericht über 1.000 € muss eine Beschreibung, Gliedern von deren Zweck enthalten und keine Ausgaben Berichte für zukünftiger Einkäufe archiviert werden können. Keines dieser Bedingungen können mithilfe von Anmerkungen für Daten erfüllt sein, aber ich kann einfach bringen Sie imperativ.

.NET RIA Services enthält ein feature namens gemeinsamen code, der können Sie Geschäftslogik in Ihrem Projekt server definieren, die synchronisiert und in der Clientanwendung verfügbar werden. Während der code Projektion werden als freigegebene code zwischen Projekten anstelle von übersetzten und die vom Proxy bearbeitet wurden kopiert. Um dieses feature nutzen zu können, erstellen Sie zunächst eine neue Codedatei in Ihrem Projekt server mit dem suffix des .Shared. [Sprache-Erweiterung] (beispielsweise ExpenseData.shared.cs). Wenn der code Projektion-Prozess ausgeführt wird, wird insbesondere Suchen nach Dateien innerhalb des Projekts mit diesem suffix und als freigegebene code zu behandeln.

Es ist eine neue Daten Anmerkung in der .NET Framework 4.0 bezeichnet der CustomValidationAttribute, in dem Sie eine benutzerdefinierte Gültigkeitsregel ein Datenmodell die Entität oder der Eigenschaft-Ebene zuordnen kann. Angeben von zwei benutzerdefinierte Gültigkeitsprüfung Regeln könnte folgendermaßen aussehen:

[MetadataType(typeof(ExpenseReportDetailsMetadata))]
[CustomValidation(typeof(ExpenseReportValidation),
  "ValidateDescription")]
public partial class ExpenseReportDetails { }

public partial class ExpenseReportDetailsMetadata {
  [Bindable(true, BindingDirection.TwoWay)]
  [CustomValidation(typeof(ExpenseReportValidation), 
    "ValidateDateIncurred")]
  [Display(Name = "Date", 
    Description = "The date of when this expense was incurred.")]
  public object DateIncurred;

Der .NET RIA Services Projektion Prozess der CustomValidationAttribute bekannt, und wird an die Clientproxy geleitet. Da die benutzerdefinierte Gültigkeitsprüfung innerhalb eines Typs Gültigkeitsprüfung enthalten ist (, die Sie wahrscheinlich auf dem server definieren möchten), können Sie freigegebene code für die Synchronisierung nutzen.

Die Signatur für eine benutzerdefinierte Gültigkeitsprüfung-Methode muss ein bestimmtes Muster folgen:

[Shared]
public static class ExpenseReportValidation {
  public static bool ValidateDateIncurred(object property, 
    ValidationContext context, out ValidationResult validationResult) {

    validationResult = null;
    bool result =       DateTime.Compare((DateTime)property, DateTime.Now) < 0;

    if (!result)
      validationResult = new ValidationResult(context.DisplayName + 
        " must be today or in the past.");
      return result;
  }
}

Beachten Sie die Verwendung der SharedAttribute für die ExpenseReportValidation-Klasse. Dies gibt an, an den Prozess Projektion, den Sie an den client übersetzt werden, da es auch verdeckt werden, einen Teil der gemeinsamen code muss nicht.

Umbrechen von

In den alten Tagen würde Ausgaben Bericht Entwicklung von Anwendungen durch das wrapping von CRUD Operationen, um die Berichtsdaten Ausgaben. Die neuen Silverlight 3 DataGrid, DataForm, DataPager, und ObjectDataSource-Klasse können Sie erstellen die BENUTZEROBERFLÄCHE schnell, ohne zu investieren Sie in der Infrastrukturentwicklung opfern Funktionalität zum integrierte Steuerelementen verwenden. Darüber hinaus sein mithilfe von .NET RIA Services können Sie definieren serverseitige Geschäftslogik mit Validierungsregeln und Datenzugriff und es leicht anwendbar Dank für den Prozess Projektion.

Mein Beispiel-Spesenabrechnung werden ein details Berichtsbereich sowie navigation und Authentifizierung weiterhin benötigt. Um dies zu erreichen, müssen es einige zusätzliche Steuerelemente erstmals in Silverlight 3 sowie eine Reihe von Anwendung Diensten von .NET RIA Services bereitgestellte verwenden. In einem zukünftigen Artikel werde ich zeigen, wie dies funktioniert.

Jonathan carter ist ein Technical Evangelist bei Microsoft.