Tuesday, December 11, 2007

OnInit not firing on controls with default property

Just build some nested controls to run on the web site, but there was some strange stuff going on.
The render method worked fine, but there weren't some values on those controls. The cause of this was that the OnInit, and the OnLoad event's weren't firing.
After some debugging and analyzing the control tree in /trace.axd, I saw there were no controls in the main control.
The reason? I'd put a [ParseChildren(ChildrenAsProperties = true,
DefaultProperty = "Groups")]
attibute on the main control, and all those controls were added to a List collection, but not to the Control collection. So ASP.net didn't took up those child controls for inclusion in the control tree.

A dirty line in the main control OnInit fixed this:
foreach (Group group in Groups) { Controls.Add(group); }.

Wednesday, November 28, 2007

.Net documentation missing

Just figured out that the HtmlWriter.AddAttribute() does an encoding based on the HtmlTextWriterAttribute enum you give as the first parameter. How? By inspecting the source code of Mono. With this knowledge I searched MSDN, but couldn't find a thing.

The bottomline: don't use a writer.AddAttribute(HtmlTextWriterAttribute.Href,
HttpUtility.HtmlAttributeEncode(url));
because then you're encoding twice.

The list of attributes which enode is:

HtmlTextWriterAttribute.Accesskey;
HtmlTextWriterAttribute.Alt;
HtmlTextWriterAttribute.Background;
HtmlTextWriterAttribute.Class;
HtmlTextWriterAttribute.Href;
HtmlTextWriterAttribute.Onchange;
HtmlTextWriterAttribute.Onclick;
HtmlTextWriterAttribute.Src;
HtmlTextWriterAttribute.Title;
HtmlTextWriterAttribute.Value;

Monday, November 12, 2007

PowerShell Shutdown COM+

To shutdown a COM+ object, so you can redeploy the binaries it uses, I had a VBS script to do it. I wondered how I could do it in PowerShell, but lacked time to do so. I just stumbled upon some code to do it, though.

The old script was:

Dim oCatalog ' As COMAdmin.COMAdminCatalog
Dim sName 'As String
Dim sMachine 'As String
Set oCatalog = CreateObject("COMAdmin.COMAdminCatalog")
sName = "Tridion Content Manager"
sMachine = "tridionserver"

oCatalog.Connect sMachine
oCatalog.ShutdownApplication sName



And this became:


$TridionAppName = "Tridion Content Manager"
$TridionMachine = "tridionserver"

$comAdmin = New-Object -comobject COMAdmin.COMAdminCatalog
$comAdmin.Connect($TridionMachine)
$comAdmin.ShutdownApplication($TridionAppName)


(Just leave the line with the call to connect out to run this on your local machine).

Saturday, November 3, 2007

Take screenshots of web pages with FireShot!

Take screenshots of web pages with FireShot!
Works with Firefox, and can grab a bitmap of the whole page (and not only from the visible area).
Very handy while debugging the design for your website (and since I'm currently implementing a css design while communicating the bugs back to the CSS designer), this tool can save some time annotating and merging bitmaps.

Friday, November 2, 2007

VS: Copy Sourcecode as Html

Although I've a javascript on this blog running to highlight code, this solution might be a lot easier.

Monday, October 29, 2007

XSS detection tool for VS2005

Microsoft download has now a tool to detect XSS leaks in ASP.NET code.

XSSDetect is a static code analysis tool that helps identify Cross-Site Scripting security flaws found within Web applications. It is able to scan compiled managed assemblies (C#, Visual Basic .NET, J#) and analyze dataflow paths from sources of user-controlled input to vulnerable outputs. It also detects whether proper encoding or filtering has been applied to the data and will ignore such "sanitized" paths.

Friday, October 26, 2007

VS 2005 Tortoise Integration

For Visual Studio 2005, settings to work with TortoiseSVN within the GUI:

VS 2005 Tortoise Integration.

Thursday, August 2, 2007

Into .Net 3.5

Last week, Microsoft released Beta 2 of VS 2008 (Orcas) with the .NET framework version 3.5. It is released with a go live license, so you can assume it's feature complete now.
There are some small bugs though, but nevertheless it is a good piece of software to work with.

Linq and Lambda functions
A great new feature is linq, and playing with some thoughts and digging up the old Sequoia View I decided to build a proof of concept of this program in .NET 3.5.

The first step is to assemble a collection of files and directories from a drive. Linq and Lambda queries works quite straightforward here; after filling a large list with a custom FileSystemEntry class, it's quite easy to get data from this list.
In the old days, getting a List entry with a specific property value needed a lot of coding. With the net .NET it's like this:

List<FileSystemEntry> list = GetList();
FileSystemEntry testId =
list.First(listEntry => listEntry.Id == "test");


Or just some plain linq to retrieve some entries form the list in a new smaller list:


List<FileSystemEntry> list = GetList();
var entries = from entry
in list
where entry.ParentId == "test"
select entry;
List<FileSystemEntry> childEntries = entries.ToList();


So basically, you can build with this two code blocks a Parent and a Children property on your class, given a List of objects where you can save your object Id and ParentId. Quite easy and straightforward to use.

In a next post, I will cover building a TreeMap of your disc with XAML and WPF.

Thursday, July 19, 2007

Firefox extensions

Maybe is CookieSafe the perfect solution for cookie management?
And Firebug is far better then the webdev toolbar.

Wednesday, July 11, 2007

MCSD!


Got my MCSD today!!!

Saturday, June 16, 2007

Syntax Highlighting on blog

I'm currently working on client side syntax highlighting on this blog. It's possible some code is collored in a strange way... but that's because this is work in progress.

It's basically done with css and javascript regular expressions. Take a look at the source code to see how.

Threading, Word Interop and processes

A not so nice thing with threading is you can't kill threads running unmanaged (and so Office Interop) code.

A quick and dirty way to handle those things is use the diagnostic library to kill the process with the unmanaged code name. An example with word gives:


using System;
using System.Diagnostics;
using System.Threading;
using Microsoft.Office.Interop.Word;

namespace WordThreadingTest
{
class Program
{
static void Main(string[] args)
{
ApplicationClass apc = new ApplicationClass();
Application app = apc.Application;
object missingValue = Type.Missing;

Thread t = new Thread(RunWord);
string filename = @"D:\My Documents\Visual Studio 2005\Projects\WordThreadingTest\test.rtf";
Console.WriteLine("start thread");
t.Start(app); // Run WriteY on the new thread
Thread.Sleep(50000);
if (t.IsAlive)
{
object myFalse = false;
Console.WriteLine("quit app on main thread");
app.Quit(ref missingValue, ref missingValue, ref missingValue);
t.Abort();
Process[] pProcess;

pProcess = Process.GetProcessesByName("WINWORD");

pProcess[0].Kill();

}
}

private static void RunWord(object application)
{
Application app = (Application) application;
app.DisplayAlerts = WdAlertLevel.wdAlertsNone;
object filename = @"D:\My Documents\Visual Studio 2005\Projects\WordThreadingTest\test.rtf";

// Open the document to print...
object missingValue = Type.Missing;

// use OpenOld so as to be compatible with other versions of
// word
Console.WriteLine("open file");
Document document = app.Documents.OpenOld(ref filename,
ref missingValue, ref missingValue,
ref missingValue, ref missingValue, ref missingValue,
ref missingValue, ref missingValue, ref missingValue,
ref missingValue);


object myTrue = true; // Print in background
object myFalse = false;

app.ActivePrinter = "Adobe PDF";
// Using PrintOutOld to be version independant
Console.WriteLine("print file");
app.ActiveDocument.PrintOutOld(ref myTrue,
ref myFalse, ref missingValue, ref missingValue,
ref missingValue, ref missingValue, ref missingValue,
ref missingValue, ref missingValue, ref missingValue,
ref myFalse, ref missingValue, ref missingValue,
ref missingValue);
Console.WriteLine("close file");
document.Close(ref missingValue, ref missingValue, ref missingValue);

// Make sure all of the documents are gone from the queue
while(app.BackgroundPrintingStatus > 0)
{
Console.WriteLine("waiting...");
Thread.Sleep(250);
}
Console.WriteLine("quit app on thread");
app.Quit(ref missingValue, ref missingValue, ref missingValue);

}
}
}

DevDays Amsterdam 2007

This one in Dutch:

Verslag Microsoft DevDays 2007

13 en 14 juni 2007, Amsterdam

De Microsoft DevDays is een congres waar de laatste ins en outs op het gebied van software development van Microsoft behandeld worden. Aan de ene kant worden er nieuwe, aankomende producten en technieken behandeld, terwijl aan de andere kant bestaande, meestal minder bekende producten, worden gedemonstreerd.

Aankomende producten

De keynote van de DevDays werd gehouden door Scott Guthrie , General Manager bij de Microsoft Developer Division, waarbinnen hij onder andere verantwoordelijk is voor ASP.NET, de CLR, WFP, Silverlight en Visual Web Developer. In de keynote ging hij vooral in op Silverlight.

Silverlight


Kort door de bocht is Silverlight Microsofts implementatie van flash. In de bewoording van Microsoft is Silverlight de manier om RIA’s te bouwen (Rich Internet Applications). Aangezien Microsoft met WPF een techniek heeft om visueel aantrekkelijke applicaties te bouwen voor het Windows platform, is Silverlight de manier om deze technieken naar de browser te brengen. In dat opzicht is Silverlight meer dan flash. Waar flash een binair bestandsformaat kent, is de basis van Silverlight een XAML bestand, waarnaast een code behind werkt om de code in te bewaren. Met het XAML bestand kan je fantastische dingen doen. Een ander voordeel van werken op deze manier is dat, net als bij ASP.NET, de opmaak en code gescheiden zijn zodat er makkelijker met designers samengewerkt kan worden.
Silverlight ondersteunt AJAX-achtige technieken, en is het mogelijk om in de 1.0 versie via javascript met pagina-objecten en Silverlight component te communiceren. Verder weg in de toekomst ligt de 1.1 versie, waar Microsoft een paar andere ontwikkellijnen laat samenkomen. Die versies ondersteunen namelijk client side .Net talen met een beperkte subset van de .Net bibliotheken. Client side code kan dan met behulp van Silverlight in C# geschreven worden, waar precies dezelfde functies aangeroepen kunnen worden als in een server side script. Als bonus zal dit alles beter performen dan client side javascript.
Een heftige claim, maar pas als microsoft een demo met een video editor in een browser te voorschijn tovert zie je pas echt hoe krachtig het concept is. Tot slot is Silverlight browser onafhankelijk. Microsoft heeft zelf Windows versies voor IE en Firefox geschreven en een Mac versie gemaakt. De mensen van het Mono project zijn momenteel hard bezig om een Linux versie op de rails te zetten onder de naam Moonlight .

Design wordt makkelijker

Aan het einde van komend jaar komt Microsoft met de nieuwe Visual Studio 2008 uit. Microsoft is meer bezig met designers. Nu al is de expression suite van programma’s uitgekomen waar (web)designers uitgebreide mogelijkheden hebben om schitterende creaties te maken. Deze tools werken echter met dezelfde projectformaten als Visual studio, zodat ontwikkelaars en designers niet meer bestanden over en weer hoeven te slepen, maar eigenlijk met verschillende tools op dezelfde bron werkt, inclusief source control.
Daarnaast kent Visual Studio stukken verbeterde CSS support. Niet alleen zullen asp.net controls beter met CSS kunnen samenwerken, ook kan VS veel makkelijker met css bestanden werken en precies kunnen laten zien vanwaar een bepaalde opmaak op een element vandaan komt.
Tot slot is de split design mode van onder andere Dreamweaver nu ook in VS beschikbaar. Dat wil dus zeggen dat je tegelijker tijd in design en code vensters kan werken. En als je dat toch niet zo prettig vind, beloofd men dat het schakelen tussen deze twee vensters stukken sneller geworden is.

Javascript support

Een andere in het oog springende aanpassing van Visual Studio is de ondersteuning van client side javascript in web projecten. En met ondersteuning wordt dan ook volledige IntelliSense (zie afbeelding) en debug mogelijk¬heden bedoeld. In de huidige AJAX wereld is dit dan ook echt onontbeerlijk. Met deze verbeteringen worden nu dan ook het bouwen van AJAX controls volledig ondersteund. Er zullen hiervoor standaard templates aanwezig zijn, aangezien de AJAX toolkit standaard in .Net 3.5 ingebakken zit.

.Net Framework 3.5

Naast de genoemde AJAX toolkit (die nu nog als losse download aangeboden wordt), is de belangrijkste toevoeging aan het framework LINQ. LINQ is een querytaal waarmee een willekeurige datastore vanuit je programmacode bevraagd kan worden. Hiervoor zijn er een hoop extra uitbreidingen op het framework ook noodzakelijk geworden, zoals anonieme types (het initialiseren van een variabele met het keyword var) en delta functies. Erg ingewikkelde concepten om hier uit te leggen, maar niet nodig om te begrijpen als je met LINQ aan de slag wil. LINQ zorgt namelijk dat er automatisch objecten aangemaakt worden als je bijvoorbeeld met een database werkt. Het volgende stukje code kan echter op verschillende datastores betrekking hebben.

var q =
from c in db.Customers
where c.City == "London"
select c;
foreach (Customer c in q)
Console.WriteLine(c.CompanyName);

Zo kan LINQ deze code vertalen (afhankelijk van het hier genoemde db object) naar een SQL Query, naar een XML bestand, of elke zelf geschreven LINQ translator.

Huidige producten


Naast al dat nieuws heeft de DevDays een heleboel demonstraties te bieden van bestaande technieken. Een aantal sessies richtte zich op “Paterns & Practices”, en dan vooral op het gebruik van de Enterprise Library en de Software Factories. Clemens Reijnen hield een presentatie over de WebService Software Factory (WSSF). Zoals de naam al zegt produceert een softwarefactory software (code), die voldoet aan de eisen die jij specificeert. De SF zal hierbij de ontwikkelaar leiden door het proces, rekening kunnen houden met richtlijnen ten opzichte van beveiliging en code standaarden. In het door hem gegeven voorbeeld met zowel versie 2 als versie 3 van de WSSF kan er hierdoor snel goede functionerende code geschreven worden. Daarnaast is een voordeel dat er eerst een model van de werkelijkheid gebouwd wordt, waardoor in versie 3 bijvoorbeeld pas op het laatst het gebruikte deployment model voor de webservice gekozen moet worden (in dit geval WCF of asmx). Er is hier natuurlijk een ding wat er voor de ontwikkelaar over blijft, en dat is het implementeren van de business logica.
Francesco Balena de eerste dag een presentatie over het gebruik van custom attributes en reflectie in het .net framewerk. Dit zijn twee onderbelichte eigenschappen van het framewerk die nauw met elkaar samenhangen. Met eigen gebouwde attributen is het mogelijk om metadata aan je eigen code toe te voegen. De reflectie bibliotheek is er juist om meer te weten te komen over de gebruikte code. De IntelliSense functionaliteit in Visual Studio wordt bijvoorbeeld opgebouwd door met behulp van de reflectie functies alle types met hun members uit een assembly te laden. In zijn praatje werd na de introductie een immense hoeveelheid voorbeelden over de zaal uitgestort.
Dino Esposito vertelde uitgebreid over de AJAX toolkit die verschenen is in januari van dit jaar. AJAX is de techniek om rijke web toepassingen te schrijven. De belangrijkste basis hiervan is het asynchroon maken van websites, waardoor op de achtergrond de communicatie plaats vind met de webserver, terwijl de gebruiker verder kan gaan op de oorspronkelijk pagina zonder op een refresh te moeten wachten. In de AJAX toolkit kan er op twee manieren hiermee omgegaan worden. De eerste is partial rendering, de andere is door te werken met remote services.
Deze laatste methode werkt over het algemeen met veel javascript, en vereist dat er zelf webservices aangeroepen en geschreven moeten worden door de programmeur. Voor bestaande websites betekend dit dat grote stukken code herschreven moeten worden. Vandaar dat er de eerste methode is, die op basis van brokjes html werkt en past binnen het asp.net 2.0 applicatie model. Op basis van het AJAX UpdatePanel control kan je namelijk met een snel in een eerder geschreven asp.net website AJAX principes invoegen. Alles wat binnen een updatepanel staat kan bijgewerkt worden, terwijl de pagina buiten het panel blijft staan zonder last te hebben van flikkeringen of dat je zelf javascript moet schrijven. Alle benodigde javascript browser code wordt namelijk door de UpdatePanel samen met het benodigde ScriptManager Control uitgeschreven.
Daarnaast bevat de UpdatePanel een aantal standaard functionaliteit zoals conditionele updates, standaard fout afhandeling en mogelijkheid tot het geven van voortgangsindicatoren.

Door de verscheidenheid van de presentaties is er een hoop te ontdekken op de DevDays. Het is een ideale gelegenheid om nieuwe ideeën op te doen die je in je dagelijkse werkzaamheden kunnen helpen.

Monday, May 14, 2007

Build Smarter ASP.NET File Downloading Into Your Web Applications

Web Downloads: Build Smarter ASP.NET File Downloading Into Your Web Applications: "Today many files can’t be downloaded the old fashioned way. Instead the browser usually wants to open them in another app. Here Joe Stagner discusses a workaround in ASP.NET."

Friday, April 27, 2007

C# Catch COM exception on HRESULT

Quite straightforward, but had to look it up today. The HRESULT of a COM call in C# can be used to catch errors. If the COM component throws an error, it can be used like:


uint const HRESULT_ERROR = 0x80000000;
try
{
  CallCom();
}
catch (COMException comEx)
{
  if (comEx.ErrorCode == unchecked((int)HRESULT_ERROR))
  {
    DoSomething();
  }
}


Edit: Okay, made an mistake with this. HRESULT is an unsigned integer, so comparing it with an integer is not a good idea. We need to cast it unchecked to an integer.

Thursday, March 22, 2007

Page Events

Friday, March 16, 2007

Database Publishing Wizard

Finally a Microsoft solution to get a dump of your database in a SQL script file: the Database Publishing Wizard.

Friday, February 23, 2007

JavaScript Warning while using the backspace button to go back

With all the new AJAX stuff around, using the back button can be disadvantageous for keeping your form values. While filling in forms it is very easy to press the backspace button by mistake while not in a input field and going back to your previous page.
So the best way is to let the user acknowledge the page transition while using the backspace button. It is possible to use an onbeforeunload event to confirm leaving the page, but this event also wants confirmation on following links and other exiting events.

I solved the program with the following javascript code:

var bConfirmExit = false;
function closeIt()
{
if (bConfirmExit)
{
event.returnValue = "Bij het verlaten van deze pagina verliest u de ingevoerde gegevens.";
}
}
function resetExit()
{
bConfirmExit = false;
}
function checkBS()
{
if (event.keyCode == 8)
{
bConfirmExit = true;
setTimeout("resetExit()",200);
}
}


and linked the following events in the body tag:

<body onbeforeunload="closeIt()" onkeydown="checkBS()">