Der-Albert.com sein Blog!


Mai 2006 Entries

ConfigurationElement mit beliebigen Attributen

Unter .NET 2.0 ist ja sehr einfach mit dem Klassen [b]ConfigurationSection[/b] und [b]ConfigurationElement[/b] eigene Konfigurationsabschnitte in der Web.config/App.config zu integrieren. Dazu müssen alle Attribute und Elemente einer Konfiguration dem System bekannt gemacht werden, gibt man dann z.B. in der Web.config auch Parameter an die nicht bekannt sind, dann wird eine entsprechende Exception geworfen. Soweit auch alles gewollt. Manchmal ist es allerdings notwendig das man auch unbekannte Attribute oder Elemente annehmen möchte, da zum Beispiel die entsprechenden Parameter an ein PlugIn oder DataLayer weitergereicht werden sollen, diese aber Paramter brauchen die man während der Entwicklung nicht berücksichtigen kann oder will. Um dies zu ermöglichen stellt [b]ConfigurationElement[/b] zwei virtuelle Methoden zu Verfügung: [b]OnDeserializeUnrecognizedAttribute[/b] und [b]OnDeserializeUnrecognizedElement[/b]. Diese muss man entsprechend überschreiben, darf darin jedoch nicht die Basis-Methoden aufrufen. Beispiel: [c#] public class DataLayerElement : ConfigurationElement { [ConfigurationProperty("type", IsKey = true, IsRequired = true)] public string Type { get { return (string)base["type"]; } set { base["type"] = value; } } protected override bool OnDeserializeUnrecognizedAttribute(string name, string value) { Properties.Add(new ConfigurationProperty(name, typeof(string), value)); return true; } } [/c#] Wichtig ist noch das man [b]true[/b] zurückgibt, bei false wird weiterhin eine Exception für ein unbekanntes Attribut geworfen. Wie man die unbekannten Attribute oder Elemente weiterverarbeitet hängt von Anwendungsfall ab, hier werden die Attribute einfach der Properties-Auflistung hinzugefügt. Um diese später wieder auslesen zu können.

CSS Klassen mit Javascript finden und auswerten

Wenn man Clientseitige Javascript Programmierung im Browser tätigt (für AJAX halt ein muss). So stösst man irgendwann vor das Problem auch mit JavaScript irgendwo mal eine Farbe oder ähnliches festlegen zu müssen. [code] var ele = document.getElementById('meineElementId'); ele.style.backgroundColor = '#FF3388'; [/code] Soweit kein Problem, wenn man nun mit CSS arbeitet und man verschiedenen Stylesheets unterstützen will kennt man jedoch nicht unbedingt die richtige Farbe die gesetzt werden soll. Aber sie ist sicherlich irgendwo mal in einer Style Klasse definiert worden. [code] .mainnav UL { background-color: #00829B; color: #FFFFF; border: 2px solid #000000; padding: 0; margin: 0; z-index: 21; } [/code] Ok, dann könnte man einfach den Style zuordnen und fertig. Problematisch wird es dann wenn man nur eine einzelne Eigenschaft aus dem Style haben möchte. Jetzt könnte man hingehen und für jeden dieser Fälle eine Style erstellen. Tja, viel Spaß dabei :) Eine alternative wäre es wenn man den Inhalt der Style-Klasse auslesen würde und sich einfach nur die Eigenschaft nimmt die man braucht. Dies ist möglich, leider sind auch die die Browser nicht ganz kompatibel untereinander. Ich habe da aber mal was vorbereitet. [code] StyleSheet = {}; StyleSheet.findRule = function(ruleName) { var rule = null; for (var i = 0; i < document.styleSheets.length; i++) { rule = StyleSheet.findRuleInStyleSheet(document.styleSheets[i], ruleName); if (rule != null) break; } return rule; } StyleSheet.findRuleInStyleSheet = function(styleSheet, ruleName) { ruleName = ruleName.toUpperCase(); var rules = null; if (styleSheet.rules) // IE rules = styleSheet.rules; if (styleSheet.cssRules) // FF rules = styleSheet.cssRules; var rule = null; for (var i = 0; i < rules.length; i++) { if (rules[i].selectorText.toString().toUpperCase() == ruleName) { rule = rules[i]; break; } } rules = null; return rule; } [/code] Die Anwendung ist denkbar einfach. [code] var ele = document.getElementById('meineElementId'); var rule = StyleSheet.findRule('.mainav ul'); ele.style.backgroundColor = rule.style.backgroundColor; [/code] Funktioniert auch mit allen anderen Eigenschaften eines Styles.

Wep Application Projects ist fertig

Das Visual Studio 2005 Web Applications Projects [1] (WAP) ist fertig. Mit dem WAP wird Visual Studio 2005 ein Web-Projekt ähnlich dem Visual Studio 2003 hinzugefügt. Tutorials für C# und VB-NET finden sich auf der Seite von Scott Guthrie [2], auch gibt es eine Einführung zum Thema [3].
[1] [url]http://msdn.microsoft.com/asp.net/reference/infrastructure/wap/default.aspx[/url] [2] [url]http://webproject.scottgu.com/[/url] [3] [url]http://msdn.microsoft.com/vstudio/default.aspx?pull=/library/en-us/dnvs05/html/WAP.asp[/url]

MIX 06 Session verfügbar

Von der Microsoft WebEntwickler Konferenz MIX 06 [1] sind nun die Sessions Online [2], zum Streamen und zum Download. Und im Gegensatz zu den Session der PDC 2005 funktioniert die Session-Seite auch einwandfrei mit dem Firefox.
[1] [url]http://www.mix06.com[/url] [2] [url]http://sessions.mix06.com/[/url]

App_Offline.htm Support für das Web Deployment Project

Wenn man mit dem [b]Web Deployment Project[/b] (WDP) [1] für ASP.NET 2.0 arbeitet und seine Anwendungen im Intranet veröffentlicht, so wird man sicherlich feststellen dass das WDP [b]keinen Support[/b] für die [b]App_Offline.htm[/b] [2] wie zum Beispiel das Standard Web Deployment bietet. Und man während des Veröffentlichen der Anwendung diese nicht mit einfachen Mitteln "sauber" außer Betrieb setzen kann. Doch da dass WDP auch nur "mit" [b]MSBuild[/b] arbeitet kann man dies [b]nachrüsten[/b] Dazu einfach mit der rechten Maustaste auf das WDP-Project im Solution Explorer gehen und [b]Open Project File[/b] aus dem Menü auswählen. Am Ende der Datei findet man ein paar auskommentierte <Target /> Tags. Dahinter, aber vor dem </Project> End-Tag, fügt man nun folgendes ein. [xml] $(OutputPath)..\RealRelease\ [/xml] Nutzt man dies so wird der [b]Output Folder[/b] den man in der Konfiguration angegeben hat nur noch als Temporärer Ordner verwendet, also dort nicht den eigentlichen Ziel-Ordner angeben. Den eigentlichen Ziel-Ordner muss man separat in der Projekt-Datei definieren. Innerhalb der [b]DeployPath[/b]-Tags trägt man den Pfad ein. Das Beispiel hier ist an die lokalen Gegebenheiten anzupassen. Desweiteren muss eine [b]Offline.htm[/b] im Hauptordner der Web-Anwendung vorhanden sein, diese wird dann während des kopieren zur App_Offline.htm. Der Kopierschritt wird nur im Release Build gemacht, sollte die Bezeichnung des Builds bei Dir abweichen, so ist das [b]Condition[/b]-Attribut des [b]Target[/b] entsprechend anzupassen. Das ganze nun speichern. Sollte danach das Deployment Projekt nicht mehr korrekt in der Solution ausführbar sein, so ist wahrscheinlich ein Fehler in der Projekt Datei. Diesen dann korrigieren, und ein Reload Project auf dem Projekt machen (Rechte Maustaste).
[1] [url]http://der-albert.com/archives/41-Web-Deployment-Project-ist-fertig.html[/url] [2] [url]http://weblogs.asp.net/scottgu/archive/2005/10/06/426755.aspx[/url]