Developer Blogs - dotnet-forum.de
VisualBasic Profihandbuch für nur 5€!

.
Anmeldung | Registrieren | Hilfe

.NET Developer Blogs Twitter

Probleme beim Einrichten der e-Mail Benachrichtigung im SharePoint

08.02.2010 23:47:10 | Thomas Schissler

Wollte heute ganz einfach eine Benachrichtigung für eine Liste im SharePoint einrichten. Das Ganze stellte sich als problematischer heraus als gedacht. Eigentlich ist das eine einfache Sache. Im Actions-Menü die Option “Aletr Me” aufrufen…

image

… , Einstellungen vornehmen und schon kommt eine Fehlermeldung:

The following users do not have e-mail addresses specified: <UserName>. Alerts have been created successfully but these users will not receive e-mail notifications until valid e-mail addresses have been provided

Der Link darunter mit “Set my e-Mail address” war auch nicht sehr hilfreich. Nach einigen Recherchen bin ich dann auf ein paar weitere Details gestoßen.

Zunächst habe ich herausgefunden, dass SharePoint die Benutzerprofile mit dem ActiveDirectory abgleicht, aber nur, wenn das konfiguriert ist. Das kann man unter Central Administration \ Shared Services Administration einstellen. Dort kann man im Dropdown-Menü des SharedService die Option “Open Shared Services Admin Site” aufrufen.

image

Unter “User Profiles and My Sites” kann nun die Option “User profiles and properties” gewählt werden.

image

Hier sollte zunächst geprüft werden, ob der Dienst der die User Profile mit dem ActiveDirectory abgleicht auch zur Ausführung eingeplant ist. Mit den unteren Links kann ein manueller Abgleich gestartet werden.

image

Über “View user profiles” kann man sich die importierten Profile anzeigen lassen, mit “View import log” kann man sich ein Protokoll zum Abgleich anzeigen lassen.

Sollen die Benutzer aus einer anderen Domäne importiert werden als die in der der SharePoint Server läuft, kann man über “View Import Connections” eine weitere Domäne hinzufügen.

image

Bei mir bestand dann noch das Problem, dass das Profil für meinen User nicht sauber durch den Import aktualisiert wurde. Nachdem ich den User aus der entsprechenden Site entfernt und neu hinzugefügt hatte, hat es problemlos funktioniert und ich kann jetzt meine Alerts problemlos einrichten und bin immer auf dem Laufenden was den Inhalt meiner SharePoint-Listen anbelangt.

Artikel zu SharePoint Projektmanagement im Dot.Net Magazin

08.02.2010 21:24:31 | Sebastian Gerling

Heute habe ich das dot.net Magazin zugeschickt bekommen, in dem ein Artikel zum Thema SharePoint Projektmanagement von mir unter dem Titel “Jenseits des Mythos” veröffentlicht worden ist. Inhalt des Artikels ist Stakeholder Orientierung Rapid Prototyping Roll Out Support Change Management  

LINQ-Queries dynamisch aufbauen

08.02.2010 21:00:00 | Martin Hey

Einer der größten Vorteile von LINQ to Objects ist es, dass man typsicher auch sehr komplexe Abfragen über Objektstrukturen durchführen kann. Zuweilen möchte man aber dem Anwender die Möglichkeit bieten, selbst zu bestimmen, welche Operationen mit den Objektstrukturen durchgeführt werden. Als Beispiel soll hier die dynamische Filterung und Sortierung anhand der Member des Objekts dienen. Spätestens zu diesem Zeitpunkt wird eines der größten Pro's von LINQ zum Verhängnis - die Typsicherheit.

Um hier eine gewisse Dynamik unterzubringen muss man zunächst wissen, wie LINQ-Queries aufgebaut sind. Sie bestehen aus sogenannten Expression Trees, die dann ausgeführt werden. Liegt ein LINQ-Query vor, kann man sich z.B. mit dem Expression Tree Viewer aus den C# Samples den Expression-Tree ansehen.


Um hier dynamische Filterung und/oder Sortierung zu implementieren, gilt es, einen solchen Baum dynamisch aufzubauen. Das ist gar nicht so kompliziert, wie es sich auf den ersten Blick anhört.

Angenommen, es liegt eine generische List mit Adressen vor (im Beispiel Restaurant-Adressen) - mit den für Adressdaten typischen Membern (Name, Straße, Postleitzahl, Ort). Per Parameter soll definiert werden können, welche Eigenschaft gefiltert werden soll und wie das Filterkriterium ist -gleiches gilt für die Sortierung.
Im Beispiel definiert die Klasse RestaurantRepository Zugriffsmethoden für den Zugriff auf Listen vom Typ Restaurant. Dabei kann mittels GetRestaurants eine komplette Liste abgerufen werden die Methode GetFilteredRestaurants implementiert den dynamischen Aufbau. Als Parameter dient hier zunächst ein Dictionary, dessen Key den zu filternden Membernamen und dessen Value den zu filternden Wert beinhaltet - sowie eine Liste, deren Inhalt definiert nach welchen Membern sortiert werden soll.

public static IEnumerable<Restaurant> GetFilteredRestaurants(Dictionary<string, string> filter, List<string> sort)
{
IEnumerable<Restaurant> restaurants = GetRestaurants();


#region get lambdas
// where
ParameterExpression pe = Expression.Parameter(typeof(Restaurant), "address");
Expression whereExpression = null;
foreach (string filterAttribute in filter.Keys)
{
Expression left = MemberExpression.Property(pe, filterAttribute);

string filterValue = filter[filterAttribute];

Expression right = Expression.Constant(filterValue);

if (whereExpression == null)
{
whereExpression = Expression.Equal(left, right);
}
else
{
whereExpression = Expression.And(whereExpression, Expression.Equal(left, right));
}
}

Expression<Func<Restaurant, bool>> whereCondition = Expression.Lambda<Func<Restaurant, bool>>(whereExpression, new ParameterExpression[] { pe });

var filteredItems = restaurants.AsQueryable().Where(whereCondition);

// order by
Expression queryExpr = filteredItems.Expression;
string methodAsc = "OrderBy";
string methodDesc = "OrderByDescending";

foreach (string sortCriteria in sort)
{
var type = typeof(Restaurant);
var property = type.GetProperty(sortCriteria);
var parameter = Expression.Parameter(type, "p");
var propertyAccess = Expression.MakeMemberAccess(parameter, property);
var orderByExpression = Expression.Lambda(propertyAccess, parameter);

queryExpr = Expression.Call(typeof(Queryable), methodAsc,
new[] { type, property.PropertyType },
queryExpr, Expression.Quote(orderByExpression));
methodAsc = "ThenBy";
methodDesc = "ThenByDescending";
}

#endregion

return (filteredItems.Provider.CreateQuery(queryExpr)).ToList();
}

Zunächst wird eine ParameterExpression instanziiert. Da Member mit Konstanten verglichen werden sollen, wird für jedes Filterkriterium eine MemberExpression und eine Konstante initiiert. Beides wird mit Expression.Equal verkettet. Mit Hilfe von Expression.And können mehrere solcher Vergleiche aneinandergekettet werden.

Ist die Filterung durchgeführt, kann dann noch die Sortierung bearbeitet werden. Auch hier wird wieder eine Expression mit MemberAccess initiiert. Anhand des Wertes kann dann mit Hilfe von Expression.Call die Sortierung durchgeführt werden.

Ein kleines Testprogramm zeigt dann, dass der Code auch funktioniert...

Geballtes VisualBasic Wissen fast geschenkt!

08.02.2010 19:42:49 | Jan Welker

20705967N

Der Online Buchversand terrashop bietet allen Freunden von dotnet-snippets.de und dotnet-forum.de wieder einmal ein unschlagbares Angebot:
Das Buch Visual Basic 2008 Profihandbuch & Referenz bietet auf über 500 Seiten geballtes Wissen in der aktuellen VisualBasic Version. Das Buch ist sowohl zum Lernen als auch zum Nachschlagen hervorragend geeignet.
Ab einem Bestellwert von 19€ wird innerhalb Deutschlands versandkostenfrei geliefert. Ansonsten fällt eine Versandpauschale von 3,95€ an.

Zum Angebot >>

Intel zeigt auf dem Mobile World Congress Netbook-Apps

08.02.2010 19:35:54 | Michael Hülskötter

Zugegeben, es ist mein erster Mobile World Congress (MWC), der im wunderschönen Barcelona stattfindet. Daher stellt sich bereits jetzt ein wenig Aufregung ein, was da wohl alles passieren wird. Was ich allerdings schon heute weiß: Ich fahre für Intel nach Spanien, um über all das zu berichten, was dort von 15. bis 18. Februar passieren [...]

Tipps und Tricks zu Windows 7 – Schützen Sie Ihre Suchvorgänge vor fremden Augen

08.02.2010 14:43:22 | Mathias Gronau

Für diesen Tipp benötigen Sie den Editor für lokale Gruppenrichtlinien, der nur in Windows 7 Professional oder höher enthalten ist. Wenn Sie mit Windows 7 Home Premium, Starter oder Home Basic arbeiten, funktioniert der Tipp nicht. Wenn Sie Ihren PC mit dem Windows Explorer durchsuchen, werden Ihnen die letzten Suchvorgänge angezeigt, die Sie ausgeführt haben. Wenn [...]

Tipps und Tricks zu Windows 7 – Mit Checkboxen mehrere Dateien auswählen

08.02.2010 13:01:13 | Mathias Gronau

Als stolzer Besitzer eines Tablet PC kennen Sie das ja: wenn Sie im Windows Explorer den Stift über eine Datei halten, erscheint links vom Dateinamen eine Checkbox, mit deren Hilfe Sie problemlos mehrere Dateien markieren können, um sie anschließend gemeinsam zu löschen, zu verschieben oder zu kopieren. Auf Ihrem stationären Rechner müssen Sie immer mit zwei [...]

Tipps und Tricks zu Windows 7 – Passen Sie die Schaltfläche Beenden an

08.02.2010 07:41:25 | Mathias Gronau

Standardmäßig schaltet die Schaltfläche Beenden im Startmenü von Windows 7 Ihren Rechner aus. Wollen Sie eine andere Aktion ausführen, tippen Sie auf die Schaltfläche mit dem Pfeil rechts von Herunterfahren und wählen dort eine Aktion aus, beispielsweise dass der Rechner in den Energiesparmodus versetzt oder neu gestartet wird. Wenn Sie aber wie ich den Rechner selten [...]

HowTo: Javascript und CSS Datein gebündelt und komprimiert mit Combres & ASP.NET MVC ausliefern

08.02.2010 02:06:00 | Robert Mühsig

Für eine performante Webapplikationen gilt es einiges zu beachten. Ein Punkt bei dem Y-Slow Test ist, dass man den client nicht zu viele HTTP Aufrufe zumuten soll und CSS und Javascript jeweils in großen Bündeln dem Client übergeben soll, da sonst der Browser alle anderen Ladevorgänge blockiert. Mit dem “Combres” kann man das sehr [...]SHARETHIS.addEntry({ title: "HowTo: Javascript und CSS Datein gebündelt und komprimiert mit Combres & ASP.NET MVC ausliefern", url: "http://code-inside.de/blog/2010/02/08/howto-javascript-und-css-datein-gebndelt-und-komprimiert-mit-combres-asp-net-mvc-ausliefern/" });

Endspurt: ASP.NET MVC 2 RC 2 Released

08.02.2010 01:37:04 | Jürgen Gutsch

Für alle die es noch nicht mitbekommen haben: Die RC 2 des ASP.NET MVC 2 ist raus.

Mehr zu RC 2 hat Phil Haack in diesem Beitrag: ASP.NET MVC 2 RC 2 Released

Download

DotNetKicks-DE Image

Fünf Schwachpunkte von Scrum

08.02.2010 01:12:23 | Ilker Cetinkaya

Die fünf Schwachpunkte von Scrum, in klaren Worten. Rahmenwerk, aber kein Werkzeug Die Sprintdauer Die Planung & Das Design Der Scrum Master Die Skalierung Scrum ist ein wunderbares agiles Management-Framework. Ich mag Scrum. Um ehrlich zu sein ist Scrum als “Agile für Einsteiger” ein genauso geeignetes ...

Twitter Weekly Updates – 2010-02-08

08.02.2010 00:59:00 | Mario Priebe

flip your content element – #jquery #plugin http://icio.us/yrthxa # Sketchpad – online paint drawing application #webtool http://icio.us/umgqhs # 100 Amazing How-To Sites to Teach Yourself Anything | #learning #tutorials http://icio.us/gqk4mt # 117 sources for #free #picsand #fotos http://icio.us/u3biis # 11 Ways to Use Delicious for Getting Things Done #gtd http://icio.us/toyxf4 # Collect – Process – Organize – Review

Nachlese zum 6.Treffen der SharePoint Usergroup Dresden

07.02.2010 21:45:00 | Martin Hey

Das erste Treffen der SharePoint Usergroup Dresden im Jahr 2010 fand am 28.01. statt. Gastgeber war erstmalig die datafino GmbH am Waldschlösschen und bei verschneiten Straßen war es für den ein oder anderen ein Abenteuer, zum Treffen hin und abends auch wieder zurück nach Hause zu kommen. Der Abend war aus meiner Sicht aber sehr gelungen und ich würde mich freuen, wenn wir hier öfter zu Gast sein dürfen.

Nachdem sich alle von den Anreisestrapazen mit Hilfe eines belegten Brötchens erholt und wir einen zu unseren Notebooks passenden Raum gefunden hatten, konnte der Abend beginnen.

Zunächst zeigte Ronny Schattauer theoretisch und im folgenden auch praktisch, wie er in einem Projekt Visio zur Datenmodellierung im SharePoint verwendet. Dabei werden zunächst mit Hilfe von definierten Stereotypen ER-Modelle erzeugt, diese werden dann in XML ausgegeben und mit Hilfe eines eigens geschriebenen Konvertierungs-Tools werden aus dem so erstellten Modell Template-XML-Dateien für Content-Types und Listen erstellt, die dann problemlos verteilt werden können. Wer schon jemals mehrere Content-Type-XML-Dateien per Hand erstellt und die dazugehörigen Listen-Templates, der weiß, wie fehleranfällig die manuelle Arbeit ist - und um so spannender finde ich diese Möglichkeit, sich die Arbeit zu erleichtern.

Im Anschluss an diese doch eher technische Präsentation gab es eine eher fachliche Diskussion unter dem Thema "Enterprise 2.0 mit SharePoint 2010". Und auch hier waren zum Teil sehr spannende Anregungen und Anmerkungen der Teilnehmer - und das Spektrum ging angefangen von Fragen wie "Wie hole ich Anwender ab, die auf Web 0.5 Stand sind?" bis zu "Wie funktioniert das Bewerten-Feature in SharePoint 2010 eigentlich genau?".

Abschluss bot eine kleine Verlosung, denn es gab eine Eintrittskarte zu den SharePoint Days, die im Rahmen der Basta! Spring durchgeführt werden, zu gewinnen. Ich geh davon aus, dass alles organisatorische soweit geklärt ist, und André die Karte nun schon in den Händen hält. Herzlichen Glückwunsch.

Treffen der .NET Usergroup Dresden

07.02.2010 20:46:00 | Martin Hey

Das letzte Treffen der .NET Usergroup ist noch gar nicht so lange her - letzten Mittwoch war es soweit. Eigentlich wollte ich dort auch einen Vortrag halten, aber eine fiese Erkältung hat mich davon abgehalten. Die Präsentation ist aber nur aufgeschoben und wir suchen schon nach einem neuen passenden Termin. Außerdem ärgere mich auch ein wenig, den Vortrag von Erik zum Thema
Azure verpasst zu haben

Und wo ich einmal dabei bin: Das nächste Treffen steht auch schon direkt vor der Tür: Die .NET-Usergroup Dresden trifft sich das nächste Mal am 24.02. um 18:00 Uhr. Auch dieses Mal verspricht es wieder sehr interessant zu werden: Alexander Groß - vielen bekannt von der .NET Usergroup Leipzig - macht mit uns einen Rundgang durch sein aktuelles Projekt. Technisch wird das sehr interessant, denn mit dabei ist eine bunte Mischung von Technologien, Produkten und Frameworks - um nur wenige zu nennen: FubuMVC, NHibernate, MSpec, AutoMapper, ReSharper, Rake und MSDeploy. Ohne Slides aber dafür direkt am lebenden Objekt gezeigt, bleibt viel Raum für Diskussionen und Fragen.

Wir treffen uns dieses Mal bei der Communardo Software GmbH. Nähere Informationen zum Termin und eine Anfahrtsbeschreibung gibt es natürlich auch.

Tipps und Tricks zu Windows 7 – Durchsuchen Sie das Internet aus dem Startmenü heraus

07.02.2010 20:13:28 | Mathias Gronau

Für diesen Tipp ist der “Editor für lokale Gruppenrichtlinien” erforderlich, der nur in Windows 7 Professional und höher enthalten ist. In diesen Versionen bietet das Startmenü nicht nur die Möglichkeit, den eigenen Rechner auf komfortable Weise zu durchsuchen, sondern Sie haben zusätzlich die Möglichkeit, Internetsuchvorgänge durchzuführen. Mit den folgenden Schritten aktivieren Sie dieses Feature: Loggen Sie [...]

Buch-Tipp: Cloud Computing mit der Windows Azure Platform

07.02.2010 16:28:04 | Kay Giza

*freu* Endlich mal wieder ein Blogeintrag in meiner Kategorie: Ich lese zur Zeit...

Ich lese zur Zeit das Buch '
Cloud Computing mit der Windows Azure Platform: Softwareentwicklung mit Windows Azure und den Azure Services
'.
Wer einen Einblick in die Thematik haben möchte, ist hier genau richtig!

Das Buch richtet sich an alle, die sich für das Thema Cloud Computing interessieren und in diesem Zusammenhang eine Affinität zur Microsoft Technologieplattform besitzen. Das Buch ist inhaltlich sehr breit aufgestellt, sowohl technische Entscheidern, Unternehmens- und Softwarearchitekten als auch Entwicklern dürfte das Buch gefallen.

Das Kapitel 1 und Kapitel 2 beleuchten die Thematik auf einer strategischen Ebene. Die Kapitel geben einen Überblick über Cloud Computing im Allgemeinen und die Umsetzung auf der Microsoft Technologieplattform.
Kapitel 3 bis Kapitel 6 richten sich stärker an Entwickler, die in Software-Implementierungsprojekte involviert sind und an technischen Details der Windows Azure Plattform interessiert sind. Hier werden Windows Azure, Live Framework, .NET Services und SQL Azure beschrieben. Die beiden letzten Kapitel geben einen Ausblick auf Einsatzszenarien, in denen die Windows Azure Plattform verwendet werden kann.
Kapitel 10 ist ein Update zum gedruckten Buch und ist bis zur Auflage 2 nur online erhältlich (siehe weiter unten).

Mein Kollege Holger Sirtl zeigt also auf Basis der Community Technology Preview (CTP) der Windows Azure Platform, wie Cloud Computing funktioniert, was die Windows Azure Platform leisten kann und wie Sie davon profitieren. Insbesondere geht er auf die Themen Betriebssystem für die Cloud, Personal Computing, Integration, Datenspeicherung und Software-plus-Services-Lösungen ein. Zudem werden Parallelen zu etablierten Microsoft-Technologien wie SQL Server und erklärt, wie man Azure auch mit PHP, Java oder Ruby nutzen kann.

Seit der Fertigstellung des Buchmanuskriptes hat es eine Reihe von Änderungen und Erweiterungen an der Plattform gegeben, die in einem Zusatz-Kapitel überblicksartig beschrieben werden. Zusammen mit der gedruckten Version des Buches bildet es ein Gesamtwerk, welches einen Überblick über die aktuelle Version (Stand: Januar 2010) der Windows Azure Platform gibt. Zu einem späteren Zeitpunkt werden die Neuerungen in die betreffenden Kapitel des Buches überführt und dann in einer zweiten Auflage des Buches veröffentlicht.

Kapitel 10: Aktualisierungen in Azure Version 1.0

Buch direkt kaufen:




This post is powered by www.Giza-Blog.de | Giza-Blog.de: RSS Feed
Visit:  MSDN Online | Follow MSDN Online on Twitter | Follow Kay Giza on Twitter
Daily News on MSDN:  MSDN Aktuell
© Copyright 2006-2010 Kay Giza. All rights reserved. Legal
Subscribe

Tipps und Tricks zu Windows 7 – Passen Sie die UAC an

07.02.2010 15:41:40 | Mathias Gronau

Die User Account Control (UAC) ist vermutlich dasjenige Sicherheitsinstrument von Windows Vista, das am Häufigsten missverstanden wurde. Grund dafür sind die häufigen Warnmeldungen, die die Anwender besonders auf neu aufgesetzten Systemen erhielten. In Windows 7 wurde die UAC erheblich verbessert, so dass Sie sie anpassen können, damit sie nicht mehr so störend wirkt. Sie benötigen nur [...]

Tipps und Tricks zu Windows 7 – Testen Sie die Energieeffizienz

07.02.2010 12:13:05 | Mathias Gronau

Besonders bei mobilen Geräten spielt der effiziente Umgang mit der Energie eine große Rolle. Windows 7 bringt ein verborgenes Werkzeug mit sich, das Ihnen hilft, eine Energieeffizienz-Diagnose durchzuführen und das Ihnen die Ergebnisse in einem Bericht anzeigt. Anhand dieses Berichts können Sie den Energieverbrauch Ihres Rechners optimieren. Powercfg kann noch mehr, aber jetzt wollen wir [...]

Neuerungen in Microsoft Office OneNote 2010

06.02.2010 15:32:47 | Mario Priebe

Ich bin seit einiger Zeit ein Fan von Onenote 2003 um damit meine tägliche Arbeit und private Projekte zu strukturieren. Heute habe ich mich mal der Beta von Microsoft Office Professional Plus 2010 gewidmet und mir Onenote mal etwas genauer angeschaut. Zwischen diesen beiden Versionen, liegen natürlich Welten und ich kann nun nicht genau sagen was

Twitterclient als Firefox-Extension

06.02.2010 11:16:18 | Mario Priebe

Ich habe gerade auf Twitter jemanden gesehen, der über einen Twitterclient namens Echofon tweeted. Ich, neugierig wie ich bin, klick  ja so ziemlich auf alles drauf : ) und sehe das der Client auch eine Extension für Firefox in petto hat. Ansonsten bleibt der Client nur den Mac und IPhone Benutzern vorbehalten. Man kann zwischen verschiedenen

HowTo: ASP.NET MVC Anwendungen updaten – App_Offline.htm & AJAX

06.02.2010 01:38:58 | Robert Mühsig

Um eine ASP.NET Anwendung umzudaten ist es oftmals auch nötig bestimmt dlls auszutauschen. Dazu muss natürlich auch die Anwendung runtergefahren werden. Mit ASP.NET 2.0 kam ein nettes Feature hinzu: Das App_Offline.htm. Mit diesem File kann man neue Requests abfangen und auch für AJAX Calls gibt es einen Workaround. App_Offline.htm Legt man ein File namens “App_Offline.htm” in [...]SHARETHIS.addEntry({ title: "HowTo: ASP.NET MVC Anwendungen updaten – App_Offline.htm & AJAX", url: "http://code-inside.de/blog/2010/02/06/howto-asp-net-mvc-anwendungen-updaten-app_offline-htm-ajax/" });

Entwickler-Ressourcen für IE8-Kompatibilität

05.02.2010 19:39:43 | Peter Kirchner

Dd565632.new8(en-us,VS.85)[1] Gute Startpunkte für die Entwicklung für den Internet Explorer 8 und die Berücksichtigung der Kompatibilität zu Vorgängerversionen finden Sie in den folgenden drei Portalen, die ich Ihnen empfehlen möchte.

Entwicklerinformationsindex für Internet Explorer 8

Dieser Informationsindex bietet Ihnen eine umfassende Übersicht über die für Internet Explorer 8 für Windows, Windows Server 2003 und Microsoft Vista verfügbaren Informationen. Dieser Informationsindex bietet Ihnen Zugang zu bestimmten Übersichten, Referenzmaterialien, technischen Artikeln und Weblogeinträgen, die für Entwickler hilfreich sind. Die Informationen werden dabei für den einfachen Zugriff nach Themen angeordnet.

Internet Explorer Compatibility Center

Internet Explorer 8: Was muss ich jetzt wissen?

  • Herunterladen von Internet Explorer 8
  • Wie nutze ich die neuen Features in Internet Explorer 8?
  • Meine Website funktioniert nicht richtig. Wie kann ich das Problem beheben?
  • Updates zur Einhaltung von Standards in Internet Explorer 8
Internet Explorer Application Compatibility

Dieses Dokument ist als Begleitmaterial für das Microsoft Application Compatibility Toolkit (ACT) gedacht, das ebenfalls Teil des Internet Explorer Compatibility Test Tool ist. Das Internet Explorer Compatibility Test Tool protokolliert Informationen über Browser-Sitzungen im Internet Explorer. (in Englisch)

ASP.NET Webforms Anwendungen und Ajax (Teil 2) Client Callbacks

05.02.2010 02:20:23 | Andre Kraemer

In meinem letzten Blog Eintrag habe ich erklärt, wie Ajax von Hand mit Hilfe des XMLHttpRequest Objekts implementiert werden kann.

Eine Alternative zu dieser händischen Implementierung ist die Nutzung des ASP.NET Client Callback Frameworks, welches mit der Version 2.0 von ASP.NET erschien.

Um Client Callbacks nutzen zu können muss eine ASP.NET Seite bzw. ein ASP.NET Control das Interface ICallbackEventHandler implementieren. Das Interface definiert die beiden Methoden:

RaiseCallbackEvent ist die Methode, den Aufruf des Clients entgegen nimmt. GetCallbackResult gibt das Ergebnis der serverseitigen Verarbeitung an den Client zurück.

Startet der Client eine Anfrage an eine Seite / ein Control welches ICallBackEventHandler implementiert, wird eine reduzierte Variante des ASP.NET Page Lifecycle / ASP.NET Control Lifecycle ausgeführt. Im wesentlichen entspricht die Callback Variante der "klassichen" Postback Variante, es fehlen jedoch die Methoden, die sich um das Rendering des Outputs kümmern. Außerdem werden keine Postback Events ausgeführt.

Das ganze sieht bezogen auf die Phasen also ungefähr so aus:

04lifecycle

Los gehts

Sehen wir uns das ganze nun einmal an einem konkreten Beispiel an. Als Ausgangsbasis soll eine modifizierte Kopie der Seite des letzten Beispiels mit folgendem Markup dienen:

    1     <div>

    2         <p>

    3             <ahref="#">Hier klicken zum Request einer

    4                 statischen Datei </a>

    5             <br/>

    6             <ahref="#">Hier für Hello World WebService klicken </a>

    7             <br/>

    8             <ahref="#">Hierfür Echo WebService klicken. Geben Sie bitte vorher eine Zahl in nebenstehendem Feld ein: </a>&nbsp;

    9             < asp : TextBox ID ="TextBox1" runat ="server" Width ="40px">4711</asp:TextBox>

   10         </p>

   11     </div>

   12     <divid="content">

   13         Bitte klicken Sie auf einen der Links, damit dieser Bereich gefüllt wird.

   14     </div>

 

Der Server

Auf Serverseite müssen wir nun in unserer Seite das Interface ICallbackEventHandler implementieren. Ausgehend von unserem Markup gilt es drei Operationen zu unterstützen:

  • Zurückgeben des Inhalts einer statischen Datei
  • Aufruf einer parameterlosen Methode eines Webservices, die "Hello World" zurück gibt
  • Aufruf einer Methode Echo eines Webservices, welche einen numerischen Wert entgegen nimmt und einen String zurück gibt.

Welche Operation auszuführen ist, unterscheiden wir anhand des einzigen Arguments der Methode RaiseCallbackEvent: eventArgument.

    1 publicpartialclassTeil2 : Page, ICallbackEventHandler

    2 {

    3     privatestring callbackResult;

    4 

    5     publicvoid RaiseCallbackEvent(string eventArgument)

    6     {

    7         switch (eventArgument)

    8         {

    9             case"static":

   10                 this.ReadStaticFile();

   11                 break;

   12             case"HelloWorld":

   13                 this.CallHelloWorldService();

   14                 break;

   15             case"Echo":

   16                 this.CallEchoService();

   17                 break;

   18             default:

   19                 this.ReturnUnknownOperationError();

   20                 break;

   21         }

   22     }

   23 

   24     publicstring GetCallbackResult()

   25     {

   26         returnthis.callbackResult;

   27     }

Je nach Wert des Arguments eventArgument wird eine andere Methode zur weiteren Verarbeitung aufgerufen. Jede dieser Methoden schreibt ihr Ergebnis wiederum in das Feld callbackResult. Dieses wird wiederum als Ergebnis der Methode GetCallbackResult an den Client zurück gegeben.

Der Inhalt der verarbeitenden Methoden sieht wie folgt aus:

Auslesen der statischen Datei:

    1 privatevoid ReadStaticFile()

    2 {

    3     using (var reader = newStreamReader(Server.MapPath("~/static.html")))

    4     {

    5         this.callbackResult = reader.ReadToEnd();

    6     }

    7 }

Aufruf der Methode HelloWorld des Webservices:

    1 privatevoid CallHelloWorldService()

    2 {

    3     this.callbackResult = newAjaxDemoService().HelloWorld();

    4 }

Aufruf der Methode Echo des Webservices:

    1 privatevoid CallEchoService()

    2 {

    3     int value;

    4     int.TryParse(this.TextBox1.Text, out value);

    5     this.callbackResult = newAjaxDemoService().Echo(value);

    6 }

Wie man beim Aufruf der Webservice Methoden sieht, geschieht dieser Aufruf nun vom Server aus und nicht vom Client. Dadurch dass im Gegensatz zum vorherigen Beispiel der Client nun nicht mehr direkt den Service ruft, musste ich mir einen Proxy auf Serverseite erstellen.

Schön, aber wie komme ich nun auf den Server?

Bisher haben wir zwar geklärt, was auf dem Server alles geschehen muss, damit Client Callbacks funktionieren, offen ist allerdings noch, wie man überhaupt vom Client auf den Server kommt.

Der Aufruf des Servers geschieht über die JavaScript Funktion WebForm_DoCallback. Einen entsprechenden Aufruf der Methode kann man sich über den ClientScriptManager der Seite anhand der Methode GetCallbackEventReference erzeugen lassen. Zeile 5 des folgenden Listing demonstriert dies.

    1 protectedvoid Page_Load(object sender, EventArgs e)

    2 {

    3     var clientScript = Page.ClientScript;

    4     string callbackReference =

    5         clientScript.GetCallbackEventReference(this, "argument", "requestFinished", "context", true);

    6 

    7     string script = string.Format("function sendAjaxRequest(argument, context){{\n {0}; }}", callbackReference);

    8 

    9     if (!clientScript.IsClientScriptBlockRegistered("callback"))

   10     {

   11         clientScript.RegisterClientScriptBlock(this.GetType(), "callback", script, true);

   12     }

   13 }

Die Methode GetCallbackEventReference hat in der höchsten Überladung folgende Parameter:

  Parameter Bedeutung
control Servercontrol, dass den Callback behandelt.
argument Argument, das an die Methode RaiseCallbackEvent des behandelnden Controls geschickt wird.
clientCallback Name der Javascript Funktion, die die Rückgabe des Servers im Erfolgsfall behandelt.
context Javascsript Code, der ausgeführt wird, ehe die Anfrage an den Server geschickt wird. Achtung, hierbei handelt es sich nicht um einen JavaScript String, sondern um einen Befehl / eine Funktion
clientErrorCallback Name der Javascript Funktion, die die Rückgabe des Servers im Fehlerfall behandelt. In meinem Beispiel habe ich diesen Paramter nicht gesetzt.
useAsync Boolscher Wert, der angibt, ob die Anfrage asynchron (true) oder synchron (false) abgesetzt werden soll.

Der Einfachheit halber verpackt man den generierten Aufruf der Methode WebForm_DoCallback in eine eigene JavaScript Funktion, die nur noch die wirklichen variablen Parameter argument und context entgegen nimmt, wie in Zeile 7 geschehen. Anschließend registriert man wie in Zeile 9 - 11 noch einen ClientScriptBlock für diese Funktion, der wie folgt in die Seite gerendert wird.

    1 <scripttype="text/javascript">

    2     //<![CDATA[

    3     function sendAjaxRequest(argument, context) {

    4         WebForm_DoCallback('__Page', argument, requestFinished, context, null, true);

    5     } //]]>

    6 </script>

Die generierte Methode sendAjaxRequest kann man anschließend wie folgt aufrufen:

    1             <ahref="#"onclick="sendAjaxRequest('static', showMessage());">Hier klicken zum Request einer

    2                 statischen Datei </a>

    3             <br/>

    4             <ahref="#"onclick="sendAjaxRequest('HelloWorld', '');">Hier

    5                 für Hello World WebService klicken </a>

    6             <br/>

    7             <ahref="#"onclick="sendAjaxRequest('Echo', null);">Hier

    8                 für Echo WebService klicken. Geben Sie bitte vorher eine Zahl in

    9             nebenstehendem Feld ein: </a>

Zeile 1 zeigt, wie der Parameter context genutzt wird. Ich übergebe einfach die JavaScript Funktion showMessage als Argument. Diese wird nun automatisch aufgerufen, ehe der Request gestartet wird. Dies ist zum Beispiel bei länger dauernden Ajax Aufrufen sinnvoll, bei denen man dem Benutzer einen Hinweis anzeigen möchte, wie folgendes Listing zeigt:

    1 <scripttype="text/javascript">

    2     function showMessage() {

    3         var contentDiv = document.getElementById('content');

    4         contentDiv.innerHTML = 'Lade...';

    5     }

    6 </script>

Wichtig ist, dass der Parameter keinen String entgegen nimmt (wie leider in vielen Beispielen fälschlicherweise gezeigt), sondern eine JavaScript Funktion!

Eigentlich Interessant für unser Beispiel ist jedoch nicht der Parameter context, sonder der Parameter argument. Der Inhalt dieses Parameters (und nur dieser!) wird an die Methode RaiseCallbackEvent des Servers übergeben. Er steuert somit die auszuführende Funktionalität.

Alles beim Alten?

Spielt man nun ein wenig mit der vorgestellten Lösung herum, bemerkt man schnell, dass der Aufruf der Methode Echo stets ausgibt, das man 4711 eingegeben hat - auch wenn der Wert der Textbox zwischenzeitlich geändert wurde.

Ursache hierfür ist, dass ASP.NET Client Callbacks für alle Formularfelder stets die initialen Werte zurücksendet.

Screenshot der Beispielanwendung

Abhilfe schafft folgender JavaScript Code:

    1 __theFormPostData = '';

    2 WebForm_InitCallback();

Diesen packt man einfach in eine JavaScript Funktion, z. B. mit dem Namen repostForm.

Gibt man diese nun als context während des Aufrufs an:

    1 <ahref="#"onclick="sendAjaxRequest('Echo', repostForm());">Hier [...]

werden auch die geänderten Eingaben des Benutzers übertragen.

Screenshot zeigt dass die geänderten Werte übertragen wurden

Fazit

ASP.NET Client Callbacks sind eine schnelle und einfache Lösung um Ajax Funktionalitäten unter ASP.NET ab der Version 2.0 zu implementieren.

Bei aller Einfachheit sollte man jedoch beachten, dass diese Lösung auch einige Schwächen hat:

  1. Auf dem Server wird fast der komplette Page Lifecycle ausgeführt. Daher sollten Codebestandteile, die bei einem Callback nicht zwingend ausgeführt werden müssen immer durch ein if(!Page.IsCallback) ... geklammert werden, um unnötige Wartezeiten zu verhindern.
  2. Bei jedem Callback wird der komplette Viewstate zum Server übertragen. Gerade bei großem Viewstate und schlechter Internetanbindung verlangsamt dieser Umstand die Ajax Anfrage enorm.
  3. Es kann immer nur ein Argument an den Server übergeben werden. Möchte man mehr als eins übergeben, muss man die Werte durch ein Trennzeichen trennen und auf der Serverseite auseinanderpflücken
  4. Das übergebene Argument wird nicht wieder vom Server auf den Client zurück übertragen. Somit ist es in der verarbeitenden Javascript Funktion auf dem Client unmöglich herauszufinden, welche Operation ursprünglich gestartet wurde. Abhilfe schafft auch hier ein zusammengesetzter Rückgabewert, oder aber eine eigene verarbeitende Funktion je Operation.

Hat man diese Schwächen jedoch im Blick, lassen sich mit ASP.NET Client Callbacks wunderbare Ajax Applikationen implementieren.

Unter der Haube arbeiten diese Client Callbacks übrigens genauso wie das händische Beispiel aus dem letzten Blogpost - nämlich mit dem XMLHttpRequest Objekt:

Screenshot des JavaScript Debuggers, zeigt Zugriff auf XMLHttpRequest Objekt



blog.codemurai.de © André Krämer |Impressum | Abonieren

Ebook Flatrate + 2 GB Web Storage für lau

04.02.2010 23:10:41 | Mario Priebe

Wenn man sich auf eload24.com mit dem Promocode 7398F6 registriert (einfach den Link klicken) bekommt man eine 30tägige Ebook-Flatrate geschenkt. Nach der Aktivierung des Accounts trudelt eine weitere Mail, inklusive eines PromoCodes ein, mit der man sich auf gigabank einen kostenlosen Account mit doppelten Speicherplatz (2GB anstatt 1GB) sichern kann. Nach Ablauf der 30Tage Flatrate bei eload24

Intel-Netbook-Contest-Gewinner stehen fest

04.02.2010 16:47:23 | Michael Hülskötter

Anfang Dezember 2009 hatte ich darüber berichtet: Besonders begabte Software-Entwickler sollten möglichst schnell ihre besten Netbook-Apps einreichen. Damit sie die Chance haben, an einen der fünf tollen Preise heranzukommen, die Intel im Rahmen seines Wettbewerbs “Submit early, win big!” auslobt. Und seit gestern ist es soweit: Die fünf Gewinner stehen fest. Sie werden dafür belohnt, [...]