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…
… , 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.
Unter “User Profiles and My Sites” kann nun die Option “User profiles and properties”
gewählt werden.
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.
Ü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.
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.
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
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...

08.02.2010 19:42:49
|
Jan Welker
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
>>
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 [...]
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 [...]
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 [...]
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 [...]
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/" });
08.02.2010 01:37:04
|
Jürgen Gutsch
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 ...
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
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.
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.
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 [...]
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 |
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
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 [...]
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 [...]
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
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
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/" });
05.02.2010 19:39:43
|
Peter Kirchner
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.
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 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
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)
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:
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>
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.
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.
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:
-
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.
-
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.
-
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
-
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:
blog.codemurai.de © André Krämer |
Impressum |
Abonieren
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
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, [...]