Javascript in UserControl in UpdatePanel

Wenn man weiß, wie es geht, ist alles einfach. Aber JavaScript in UserControls innerhalb eines UpdatePanels funktionstüchtig zu bekommen hatte für mich - bis heute! - immer etwas mit Magie zu tun... Hinzu kam heute, dass ich noch Sys.UI.DomElement-Methoden nutzen wollte (aus der AJAX-Bibliothek). Folgende Versuche habe ich gemacht:

1. Page.ClientScript.RegisterClientScriptBlock(GetType(), "helpful_css_" + ClientID, script, true);
2. ScriptManager.RegisterClientScriptBlock(this, GetType(), "helpful_" + ClientID, script, true);
3. Page.ClientScript.RegisterStartupScript(GetType(), "helpful_css_" + ClientID, script, true);
4. ScriptManager.RegisterStartupScript(this, GetType(), "helpful_css_" + ClientID, script, true); // <-- this is it!

 

Zu 1. und 3. ist zu sagen, dass sie innerhalb einen UpdatePanels nur nach dem ursprünglichen PageLoad funktionieren, nicht nach einem asynchronen Postback. Also fallen sie raus. Außerdem fallen 1. und 2. weg, weil an der Stelle, an der der hier übergebene JavaScript-Code in die Seite generiert wird, der $Sys-Namespace noch nicht definiert ist (ähnlich wie hier: http://encosia.com/2007/08/16/updated-your-webconfig-but-sys-is-still-undefined/).

Bleibt nur 4. Und 4. funktioniert sowohl nach dem initialen PageLoad als auch nach einem async Postback und man kann $Sys verwenden. Wunderbar!

1. oder 2. bleiben allerdings nützlich, wenn man Custom Javascript in die Seite einfügen will, um es weiter unten auf der Seite zu nutzen. Wahlweise kann man natürlich auch die Methode RegisterClientScriptInclude nutzen, um das Javascript in eine eigene Datei auszulagern. Soviel dazu.

Oliver


Abnahme von Web-Formularen

Gesucht sind leichtgewichtige Kriterien für das Testen und Abnehmen von Formularen unabhängig von der eigentlichen Funktionalität (Speichern von Ratings, Verschicken von Emails).

Upload-Formular (Datei, Bild, ..) (sollten getestet werden mit)

  • eigenwillige Dateinamen, mit Sonderzeichen, mit Punkten, ohne Endung
  • zu große Dateien
  • nicht unterstützte Dateitypen

Texteingabefelder (sollten getestet werden auf)

  • keine Eingabe
  • sehr große Eingabe
  • komischer Inhalt: Am besten mit chinesisch und türkisch Testen
  • Script-Injektion

DropDownlisten/Radios/Checkboxen (sollten getestet werden auf)

  • verhalten wenn keine Auswahl getroffen wurde

Allgemeine Kriterien:

  • Sinnhaftigkeit von Benutzer-Feedback (Fehlermeldung, Aufforderungen, etc.).
  • Vorhanden sein von Benutzer-Feedback
  • Ist das Feedback auch in kleine Auflösungen auf dem Bildschirm sichtbar?

Verschiedene Browser

  • Feedback sollten in den von der Anwendung unterstützten Browsern getestet werden.
  • Interaktivitäte/dynamische Formularelemente sollten getestet werden.

.gitignore

Unser “.gitignore” File für die Verwendung mit Visual-Studio und Resharper.

_svn/
.svn/
obj/
[Bb]in/
[Dd]ebug/   
[Rr]elease/   
_Re[Ss]harper.*
*.resharper
*.resharper.user
*.suo
*.cache
*~
*.swp


Build Dauer ermitteln

Der schnellste Weg die Builddauer zu ermitteln führt über die Kommandozeile: msbuild /target:Rebuild SomeSolution.sln und am Ende steht dann etwas wie:  “Time Elapsed 00:00:16.53”


MSBuild output verbosity in VS2008

Wie lange dauert die Ausführung eines MS-Build Scripts?

MSBuild-Verbosity

Als Ergebnis gibt es einen wirklich sehr, sehr verbosen Build-Output an dessen Ende dann steht:

Build-Output-Details 

Und jetzt ist auch klar, dass auf die Gesamt-Build-Zeit von ca.: 35sec 0.49 Sekunden auf das BuildScript selbst entfallen. Ähm.. - gut zu wissen :-)


Benamungs-Strategien

  • SettingsApp
  • SettingsUser
  • SettingsSubSystemX

vs.

  • AppSettings
  • UserSettings
  • SubSystemXSettings

beides hat seine für und wider. Variante 1 ist IntelliSense freundlicher und Variante 2 ist näher an der Grammatik.

Ich bin ich ganz klar - soweit die Wortgebilde nicht total obskur werden - meist für Variante 1.


Enum / Flags einfach und sicher definieren

Hier (http://blogs.msdn.com/kcwalina/archive/2004/05/18/134208.aspx#5943757) habe ich eine Methode gefunden, wie man einfach und ohne Mathekenntnisse (für einige von uns ;-)) Flag-Enums definiert:

enum Color
{
    None   = 0,
    Blue   = 1 << 0,
    Red    = 1 << 1,
    Yellow = 1 << 2,
    
    Purple = Blue | Red,
    Orange = Red | Yellow,
}

Oliver


CPE (CollapsiblePanelExtender) per JavaScript öffnen

Bevor ich noch x Mal durchs Web klicke, hier der Einzeiler:

hplCatBox.Attributes["onclick"] = "javascript:$find('" + cpeInqCat.BehaviorID + "').expandPanel(new Sys.EventArgs)";


Über Chrome

“It seems like Google doesn’t really want 100% browser share with Chrome. They just wanted, in so many words, to shame the other browsers (less Firefox than IE) into moving toward HTML 5, into having better JavaScript performance, and those kinds of things.”

- von Scott Swigard in einem Interview mit Sean Campbell von Songbird


Dependency Injection in Legacy Projekt 2

Das Digram soll die tatsächlich Architektur für den _ersten_ Schritt des Einbaus zeigen.

DI-Diagram

Die physischen Abhängigkeiten sehen nochmal anders aus, da die GUI direkt mit Typen aus der Applikation arbeitet.

Die architektonische "Schichtung" ergibt sich aus der Notwendigkeit "zirkuläre" Referenzen zu verhindern. Aus diesem Grund sind Container und Service-Locater auch physisch getrennt.

Ein volle Entkopplung macht im tatsächlichen Anwendungsfall aus jetziger Perspektive auch keinen Sinn und ließe sich auch leicht nachträglich einziehen.