Internet Explorer 8 Exorzismus

Was den gutgläubigen (Katholiken) befallen kann, fällt jetzt auch über Websites her. Der Teufel in Form des Internet Explorer 8 ( Beta 2) befällt gut aussehende junge Webseiten bis nur mehr eine grausige Fratze übrigbleibt. Hier hilft weder beten noch Weihwasser. Nur ein Meta Tag Eintrag <meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7" /> oder ein HTTP Header X-UA-Compatible: IE=EmulateIE7 kann helfen aus einem IE8 wieder einen IE 7 zu machen. Oder jeder Benutzer drückt den Button im Browser “Seite als IE 7” darstellen. Orakel: http://support.microsoft.com/kb/952030/en-us

IE 8 Beta 1 deinstallieren

da ja gerade die Beta 2 von Internet Explorer 8 rausgekommen ist, wollte ich die Beta 1 deinstallieren. Musst ganz schön lange suchen um dann unter installierte Updates fündig zu werden.

Automatisiertes posten von ASP.NET Formularen verhindern

Aus irgendeinem Grund werden seit einigen Tagen viele Bestellungen für mein ASP.NET 2.0 Buch vorgenommen. Was sich zunächst gut anhört, ist bei Blick in die Logfiles ein automatisiertes ausfüllen von ASP.NET Textboxen mit anschliessendem Post. Und das von verschiedenen IP Adressen aus verschiedenen Ländern. Keine Ahnung warum das so ist. Grundsätzlich wird diese Art meist verwendet um Gästebücher oder Blog Kommentare zu füllen mit dem Ziel Links auf die eigenen Web Sites zu platzieren um bei Google und & co weiter oben zu sein. Die Abhilfe sind sogenannte Captchas. Das sind Bilder auf denen Text versteckt ist den man dann wieder abtippen muss. Die Erstellung solcher Grafiken ist mit .NET möglich, aber aufwendig. Ich habe deshalb eine mathematische Aufgabe gestellt die der User lösen muss Da ich ein minimalen Aufwand betreiben woilte habe ich einfach einen CompareValidator, 2 Textboxen und minimalen Code verwendet. Zunächst die “komplexe” Geschäftslogigk Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs)        Dim a As Integer = Rnd() * 10        Dim b As Integer = Rnd() * 10        lblCaptcha.text = a.ToString + " + " + b.ToString        hiddenCaptcha.Text = a + b End Sub Dann die auch ganz leichte Eingabeprüfung <asp:TextBox ID="txtCaptcha" runat="server"></asp:TextBox>              <asp:CompareValidator ID="cv1" runat="server" Display="Dynamic"                  ErrorMessage="Bitte das rechenergebnis eintragen" ControlToValidate="txtCaptcha" ControlToCompare="hiddenCaptcha"></asp:CompareValidator> Der einzige Trick den ich verwendet habe ist rund um die zweite Textbox. Normalerweise würde man auf ein Hiddenfield tippen, wenn man Daten in der Page haben möchte und diese nicht anzeigt. Leider kann der CompareValidator nicht auf ein Hiddenfield vergleichen und so muss eine Textbox her. Wenn man dort visible auf false setzt, wird diese aber nicht mehr zum Client übertragen. Also folgender Trick um eine Textbox quasi unsichtbar zu  machen: <asp:TextBox ID="hiddenCaptcha" runat="server"  Enabled=false  Height=0 Width=0 BorderStyle="None"  BorderColor=White></asp:TextBox>

ASP.NET Windows Anmeldung erzwingen

Gaaanz oft höre ich, auf meiner lokalen Maschine geht alles und wenn ich das Projekt auf den Webserver kopiere dann fehlen die Rechte. Für den speziellen Fall einer Intranet Anwendung möchte ich das kurz klären. Wenn man mit Visual Studio (2005 / 2008) eine Website oder ein Webprojekt erzeugt wird immer das Projekt mit dem Web Dev Server gestartet. Dieser erscheint als Icon rechts unten und läuft auf einem zufälligen Port in der form http://localhost:12121/anwendung.aspx. Dabei wird der “kleine” Webserver immer mit den Rechten des aktuellen Benutzers = Developer gestartet. Die meisten Developer (ja ich auch) arbeiten mit Admin Rechten. Also darf die so erstellte Anwendung alles (zb Filezugriff). Wenn man die Anwendung auf einen IIS kopiert und nichts besonderes konfiguriert läuft jeder Zugriff anonym. Der anonyme Benutzer wird dann je nach Umgebung mit dem IUSR_machinenename oder dem im Application Pool konfigurierten Benutzer ( zb Network Service). Wenn man nun möchte das eine automatischen Anmeldung erzwungen wird reicht in der Web.Config folgender Eintrag. Das ? bewirkt das anonyme Benutzer nicht zugelassen werden. < authentication mode="Windows"> </ authentication> < authorization> < deny users="?"/> </ authorization> Schon kann man per user.identity.name auf den angemeldeten Benutzer zugreifen.

Formatieren von Datum in Gridview

offensichtlich hat Microsoft einen Bug aus Visual Studio 2005 behoben. Wenn man ein langes Datum in einer gebundenen Spalte auf eine kurzes Datum formatieren will musste folgendes verwendet werden. <asp:BoundField DataField="ShippedDate" DataFormatString="{0:d}" HeaderText="ShippedDate"                     HtmlEncode="False" SortExpression="ShippedDate" />              Visual Studio 2008 benötigt nur mehr <asp:BoundField DataField="OrderDate" HeaderText="OrderDate" SortExpression="OrderDate" DataFormatString="{0:d}" />

Farben aus System.Drawing.Color auflisten

Schönere Variante zu vorigen posting. Dabei filtere ich die System Farben raus und hänge an die ASP.NET Dropdownliste nur die wählbaren Farben an. Dim names() As String = System.Enum.GetNames(GetType(System.Drawing.KnownColor)) Dim x As String For Each x In names If Not System.Drawing.Color.FromName(x).IsSystemColor Then DropDownList1.Items.Add(x) End If Next

Farben in Dropdownlist anzeigen

schnell und unschön, aber super effizent Dim names() As String = System.Enum.GetNames(GetType(System.Drawing.KnownColor)) DropDownList1.DataSource = names DropDownList1.DataBind() und raus kommt    

ASP.NET Formview Textbox vorbelegen

ein kleiner reminder für mich. Wenn ein Feld einen Default wert haben soll im Formview Control hilft nachfolgender code. Das event Databound verwende ich um sicherzustellen das Databinding nicht mein Feld wieder überschreibt. Dann muss ich sicherstellen das sich Formview im richtigen Modus (Edit) befindet und überhaupt Daten vorhanden sind (Dataitemcount). Dann kann man die Textbox per findcontrol suchen und finden und wenn Textbox leer,  einen Wert zuweisen. Protected Sub FormView1_DataBound(ByVal sender As Object, ByVal e As System.EventArgs) If FormView1.CurrentMode = FormViewMode.Edit And FormView1.DataItemCount > 0 Then If CType(FormView1.Row.FindControl("txtBearbeiter"), TextBox).Text = "" Then CType(FormView1.Row.FindControl("txtBearbeiter"), TextBox).Text = User.Identity.Name End If End If End Sub

Enter statt Tab Key mit ASP.NET AJAX

Benutzer sind von Windows Formularen oft gewohnt schnell per Tab durch die Eingabefelder zu springen. In HTMl Input Elementen funktioniert das so nicht. Abhilfe gibts mit Jscript indem man das Keyup oder Keydown event behandelt und a) entweder den Tab Key simuliert oder gleich den Focus auf das Logisch nächste Element setzt. Mit Ajax kann man sehr elegant einen Handler registrieren $addHandler($get('TextBox1'), 'keydown', TextBox1_KeyDown); Optisch nicht so toll aber einfach ist es das Attribut im Textbox Element zu setzen. Visual Studio mosert das zwar an, es funktioniert trotzdem <asp:TextBox ID="TextBox1" runat="server" onkeydown="universal_keyup(this)"></asp:TextBox> Ein universeller Handler ist dann für alle Textboxen zuständig und setzt den Focus auf die nummerisch nächste Textbox. function universal_keydown(sender,evt) { if (evt.keyCode == Sys.UI.Key.enter) { // nur wenn per addHandler registriert //sender.preventDefault(); // hier: evt.returnValue = false; evt.returnValue = false; var i= sender.id.substring(9,7); i++; $get("TextBox"+i).focus(); } }   Sehr hart, kurz aber herzlich ist auch folgende Variante onKeyDown="if(event.keyCode==13) event.keyCode=9;">

Background Image einer Tabellen Zelle setzen

Grunsätzlich lässt die Überschrift wenig Probleme vermuten. Den Hintergrund einer TD kann man doch ganz einfach setzen mit <td background="images/background.gif"></td> Spätestens beim Einsatz einer Master Page und in Unterverzeichnissen wird der Pfad auf das Bild nicht mehr stimmen. Für normale Bilder lässt sich das noch lösen mit dem Zusatz runat=server <img src="images/background.gif" runat="server" /> ASP.NET ist dann so freundlich und korrigiert den Pfad. Für die Tabellen Zelle verwende ich immer Styles. Zusätzlich lagere ich die CSS in Themes aus so das ich keine Referenzierung auf die CSS Datei brauche und so auch in kein Pfad Proplem laufen kann. Wenn man in der Web.Config im Page Element das Attribute StyleSheetTheme und Theme richtig setzt hilft auch der Editor von Visual Studio 2008 sehr gut mit. .tabelle { background-image:url('images/background.gif'); background-repeat: repeat-x; } Die im CSS erzeugte Style Klasse wird dann noch zugewiesen. <td class="tabelle">das ist mein content</td> </tr> Fertig!