Navigatie

Contact

Send mail to the author(s) E-mail

View Richard Soeteman's profile on LinkedIn

RSS 2.0 | Atom 1.0 | CDF

Archief

Categorieën

Blogroll

Disclaimer
The opinions expressed herein are my own personal opinions and do not represent my employer's view in any way.

Sign In

Zoeken

# Tuesday, October 31, 2006
Tuesday, October 31, 2006 9:21:21 PM (GMT Standard Time, UTC+00:00) ( ASP.NET )

Inmiddels is het al weer bijna twee weken geleden dat Microsoft ASP.NET Ajax Beta heeft released. Het project waar ik aan werk maakte gebruik van ATLAS en de upgrade van een CTP kostte ons slechts enkele minuten.  De upgrade van ATLAS naar Ajax .Net ging echter niet zo simpel. Dit heeft me overigens wel verbaasd heeft omdat de CTP releases erg goed waren, een gemiste kans.  Lees dit migratiedocument en let bij een upgrade op het onderstaande:

Configuratie:

De configuratie in web.config is compleet veranderd. Appendix "Manual Configuration Changes" beschrijft hoe je je huidige web.config kan aanpassen.

Aanpassing van tagprefix:

Verder is de Prefix <ATLAS:/> veranderd in <ASP:/>. Dit houdt in dat je al je verwijzingen dus kan aanpassen.  

Deployment:

Voorheen werd een losse DLL geleverd. Deze kon je in je bin folder plaatsen en je had direct ATLAS functionaliteit. In de huidige versie wordt de DLL in de GAC geplaatst. Wanneer je een deployment naar een server waar de installatie niet is uitgevoerd, bijvoorbeeld een hosting provider kom je in de problemen omdat de Microsoft.Web.Extensions DLL niet gevonden wordt. Je krijgt onderstaande foutmelding te zien:

Could not load file or assembly 'Microsoft.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' or one of its dependencies. The system cannot find the file specified.

De Microsoft.Web.Extensions DLL is echter wel gemakkelijk uit de GAC te halen. Je zult dit echter via de Command Line moeten doen, omdat windows explorer de Assembly folder anders weergeeft dan normale folders en de DLL's dus niet te kopiëren zijn.

  1. CMD
  2. CD c:\windows\assembly\Gac_msil\microsoft.web.extensions\1.*
  3. copy microsoft.web.extensions.dll [type hier de binfolder waar de dll geplaatst moet worden]

Meer Info

Deze post beschrijft alleen de punten die we zelf tegengekomen zijn tijdens de migratie van ons project. We zijn nog een probleem tegen aangelopen met HTTPModules waarover later meer. Voor meer informatie zie de volgende resources:

Comments [2] | | # 
# Friday, September 29, 2006
Friday, September 29, 2006 11:46:34 PM (GMT Daylight Time, UTC+01:00) ( )

Afgelopen week is DasBlog 1.9 released. Ik gebruik DasBlog al ruim een jaar en ben er zeer tevreden over. DasBlog is volgens mij ook nog eens de enige op .Net gebaseerde blogtool die geen database gebruikt (wat aanzienlijk scheelt aan hosting kosten). Alle data wordt in losse XML bestanden opgeslagen.

Onderstaande functies hebben me doen besluiten direct te upgraden:

  • DasBlog 1.9 is vele malen sneller.
  • Ondersteuning voor Windows Live Writer.
  • Feedburner ondersteuning op een manier dat mijn huidige subscribers op mijn RSS feeds automatisch doorverwezen worden. Overigens weet ik nog niet of ik overstap op Feedburner.
  • Verbeterde statistieken module.
  • Er zijn een aantal extra macro's ontwikkeld die je in je templates kan gebruiken.

Voor de volledige lijst zie deze url.

Comments [2] | | # 
# Tuesday, September 12, 2006
Tuesday, September 12, 2006 10:39:37 AM (GMT Daylight Time, UTC+01:00) ( Atlas )

Gisteren maakte  Scott Guthrie bekend dat Atlas V1.0 dit jaar nog wordt released. Hierin zal niet de volledige functionaliteit worden opgenomen zoals nu in de CTP het geval is maar het wordt wel volledig door Microsoft ondersteund. De overige functionaliteit blijft via CTP's beschikbaar.

Ook hebben ze de officiële naam bekend gemaakt, hier ben ik minder gelukkig mee. Atlas was een mooie naam, had dit Microsoft Atlas genoemd en je was klaar, maar nee dit is het geworden:

De Atlas Javascript Library wordt Microsoft AJAX Library
De Atlas server controls wordt ASP.NET 2.0 AJAX Extensions
De Atlas Control Toolkit wordt ASP.NET AJAX Control Toolkit

Lees meer

Comments [0] | | # 
# Monday, August 21, 2006
Monday, August 21, 2006 2:42:16 PM (GMT Daylight Time, UTC+01:00) ( )

Normaliter blog ik niet over Excel, echter een probleemmelding waar ik vandaag betrokken bij was heeft me doen besluiten deze blogpost te plaatsen.

Een Excel document met vele Worksheets wordt geopend daarin worden 28 cellen aangepast waar de berekening van afhankelijk is. De output cellen worden door een applicatie gevuld en uitgelezen. Dit hele proces doet er ongeveer 5 seconde over. Na een aantal tests kwam ik erachter dat dit komt doordat de berekening elke keer uitgevoerd wordt wanneer een cel wordt aangepast. Dus de berekening werd 28 maal uitgevoerd.

In Excel kan je aangeven hoe berekeningen uitgevoerd moeten worden, dit gaat door property Calculation op Excel.Application te initialiseren, deze verwacht enumerator XlCalculation. XlCalculation kent de volgende waarden:

- XlCalculation.xlCalculationAutomatic, het berekenen start automatisch an het aanpassen van een cel. De standaard instelling van Excel
- XlCalculation.xlCalculationSemiautomatic, het berekenen start automatisch an het aanpassen van een cel. Echter worden tabellen worden niet meegenomen in berekening.
- XlCalculation.xlCalculationManual, Automatisch berekenen is uitgeschakeld. Berekenen dient handmatig te gebeuren.

Uiteraard wil ik uiteindelijk wel de berekening uitvoeren. Excel.Application kent hiervoor de volgende methoden:

- Calculate(), de berekening wordt uitgevoerd. De Calculate methode kan je overigens ook gebruiken op worksheets, cellen etc. Met de Calculate methode is het dus mogelijk een aparte cel opnieuw te berekenen
- CalculateFull(),de berekening wordt uitgevoerd op alle geopende workbooks
- CalculateFullRebuild(),de berekening wordt uitgevoerd en berekend tevens alle afhankelijke worksheets opnieuw.

Verder kent Excel.Application de property CalculateBeforeSave, waarmeer je aangeeft of de Calculate methode uitgevoerd moet worden voordat het Excel sheet opgeslagen wordt.Onderstaand mijn applicatie in VB.Net, de relevante regels heb ik in bold weergegeven.

Dim
excelApp As New Excel.Application()
Dim excelWorkBook As Excel.Workbook()
Dim excelworkSheet As Excel.Worksheet()

excelApp.Workbooks.Open("C:\Exceldoc.xls")
excelWorkBook = excelApp.ActiveWorkbook
excelworkSheet = excelWorkBook.Worksheets.Item(1) 'Eerste sheet

excelApp.Calculation = XlCalculation.xlCalculationManual
'Zet waarden…..

excelApp.CalculateFullRebuild() 'Bereken het Excel sheet opnieuw

excelApp.ActiveWorkbook.Saved = True
excelApp.ActiveWindow.Close()
excelApp.Quit()

'Release objects
Marshal.ReleaseComObject(excelworkSheet)
Marshal.ReleaseComObject(excelWorkBook)
Marshal.ReleaseComObject(excelApp)

Door bovenstaande aanpassing duurt het proces nog geen seconde. Een aardige performance boost door het plaatsen van twee regels code.

Comments [0] | | # 
Monday, August 21, 2006 6:56:21 AM (GMT Daylight Time, UTC+01:00) ( Tools )

Nadat de eerste CTPvan Sandcastle uitkwam was op vele weblogs te lezen dat het documenteren middels Sandcastle niet gemakkelijk was. Enkele dagen na de release waren er tools ontwikkeld om het gebruik van Sandcastle te vereenvoudigen.

Een tool die ik zelf erg prettig vind is Sandcastle Help File Builder. De tool heeft een gebruikersinterface die afgeleid is van nDoc, sterker nog je nDoc project files kan je binnen deze tool ook gebruiken. Ook is het mogelijk deze tool deel uit te laten maken van je build proces, zodat je documentatie tijdens de build automatisch gegenereerd wordt. 

Download Sandcastle Help File Builder

Comments [0] | | # 
# Thursday, August 17, 2006
Thursday, August 17, 2006 8:38:57 PM (GMT Daylight Time, UTC+01:00) ( ASP.NET )

De bekende ASP.NET Page lifecycle poster gemaakt door Léon Andrianarivony. Aangezien de link naar zijn site niet meer werkt heb ik besloten hem op mijn eigen weblog te plaatsen.



Download de poster op ware grootte

Comments [1] | | # 
# Sunday, August 13, 2006
Sunday, August 13, 2006 2:15:38 PM (GMT Daylight Time, UTC+01:00) ( ASP.NET | C# )

Afgelopen week wilde ik het standaard Xml Control wilde gebruiken, echter was het niet mogelijk XSLT direct als String door te geven, wat voor mijn toepassing wel nodig was. Voor de rest doet het Xml Control exact wat ik wil, dus uitbreiden maar.

Allereerst maken we een nieuwe klasse aan welke erft van System.Web.UI.WebControls.Xml. 
public class XmlExtender : System.Web.UI.WebControls.Xml

Op dit punt kunnen we exact hetzelfde dat het Xml Control kan. Vervolgens maken we een extra property TransformContent.

public string TransformContent
{
  set
  {
    XslTransform xslTrans = new XslTransform();
    xslTrans.Load(XmlReader.Create(new StringReader(value)));
    this.Transform = xslTrans;
  }
}

De naam is zorgvuldig gekozen, er bestaat reeds een property DocumentContent welke xml als string verwacht. TransformContent creeert een xslTransformer en leest de string in. Vervolgens geef ik de de xslTransformer aan Property Transform van het Xml control en heb ik exact de functionaliteit die ik wil hebben. Simpel maar doeltreffend.

Nu kunnen we het control gebruiken in een webapplicatie. Voor het testen van het control heb ik een  demo site ontwikkeld wat een kleine lijst met boeken toont. 

In default.aspx registreren we ons control

<%@ Register Assembly="XmlControlExtender" Namespace="ControlExtenders" TagPrefix="ext" %>

Vervolgens plaatsen we het control op de pagina.

<ext:XmlExtender ID="xmlDemo" runat="server" />

In ons codebehind geven we de documentContent en de Transformcontent mee.

xmlDemo.DocumentContent = GetXml();
xmlDemo.TransformContent = GetXslt();

GetXml geeft het xml document als string terug.

private string GetXml()
{
     StringBuilder s = new StringBuilder();
     s.Append("<?xml version=\"1.0\" encoding=\"utf-8\" ?>");
     s.Append("<books>");
     s.Append("<book><title>Programming .Net Components</title><author>Juval L&#246;wy</author></book>");
     s.Append("<book><title>.Net 2.0 Generics</title><author>Tod Golding</author></book>");
     s.Append("<book><title>Head First Design Patterns</title><author>Freeman &amp; Freeman</author></book>");
     s.Append("</books>");
     return s.ToString();
}

GetXslt geeft de xslt als string terug.

private string GetXslt()
{
   StringBuilder s = new StringBuilder();
   s.Append("<?xml version=\"1.0\" encoding=\"utf-8\"?><xsl:stylesheet version=\"1.0\"  xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\">");
   s.Append("<xsl:template match=\"/books\">");
   s.Append("<html><body>");
   s.Append("<xsl:for-each select=\"book\">");
   s.Append("Titel: <xsl:value-of select=\"title\"/><br/>");
   s.Append("Auteur: <xsl:value-of select=\"author\"/><br/><br/>");
   s.Append("</xsl:for-each>");
   s.Append("</body></html>");
   s.Append("</xsl:template>");
   s.Append("</xsl:stylesheet> ");
   return s.ToString();
}

Na het starten van de webapplicatie wordt het XML document netjes opgemaakt door de opgegeven stylesheet.

Met deze blogpost hoop ik aangetoond te hebben dat standaard Webcontrols zich makkelijk laten uitbreiden en moedig een ieder zeker aan dit ook eens te doen. 

XmlControlExtender is vrij te gebruiken in je eigen applicatie. Download de Sourcecode inclusief demo of alleen het control.

Comments [0] | | # 
# Friday, August 11, 2006
Friday, August 11, 2006 10:25:39 PM (GMT Daylight Time, UTC+01:00) ( ASP.NET )

Onlangs heb ik een project moeten migreren van .Net 1.1 naar .Net 2.0. Vele warnings kreeg ik omdat klassen obsolete waren. Vandaag had ik het Xml Webcontrol nodig en wilde daar dynamisch xslt aan meegeven. Hiervoor had ik de Transform property nodig, welke een XslTransform object verwacht. Hey was deze niet obsolete? Raar dat je tijdens een migratie eerst alle obsolete klassen moet vervangen en dan vervolgens  bij de eerstvolgende toevoeging weer een obsolete klasse moet gebruiken. Ik weet wel dat de warnings te omzeilen zijn maar ik vind het niet netjes van Microsoft ze hier geen aandacht aan hebben geschonken.

Comments [0] | | # 
# Sunday, July 30, 2006
Sunday, July 30, 2006 4:21:32 PM (GMT Daylight Time, UTC+01:00) ( ASP.NET | Atlas )

Regelmatig spreek ik ASP.Net ontwikkelaars. Vaak vraag ik hen of ze wel eens gebruik maken van Atlas, het Ajax Framework van Microsoft. De meest gehoorde antwoorden zijn; “ja”, “duurt lang om te implementeren” , “maar dat is toch nog niet officieel uit?” “ransig met Javascript”, “ransig met dat XML script”. Op antwoord twee wil ik me voor nu even concentreren.

Via onderstaande ASP.Net applicatie kan een gebruiker zijn/haar naam invoeren en na een druk op de submit knop wordt de invoer getoond, lijkt mij een wereld applicatie :-).

Onderstaand de source:

HTML:

<%@ Page Language="C#" AutoEventWireup="true"  CodeFile="Default.aspx.cs"
Inherits="_Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>Een webapplicatie</title>
</head>
<body>
    <form id="wepappForm" runat="server" defaultbutton="submit">
    <div>
        <asp:Label ID="applicatieInfo" runat="server" Text="" />
        <br /> <br />
        <asp:Label ID="yourName" runat="server" Text="Naam:" />
        <asp:TextBox ID="nameField" runat="server" />
        <asp:Button ID="submit" runat="server" Text="Submit" OnClick="submit_Click" />
        <br /><br />
        <asp:Label ID="typedValue" runat="server" Font-Bold="True" Font-Size="Large" />
        </div>
    </form>
</body>
</html>

C# CodeBehind :

using System;
using System.Configuration;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;

public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
this.applicatieInfo.Text = string.Format("Datum: {0} ", DateTime.Now);
}
protected void submit_Click(object sender, EventArgs e)
{
this.typedValue.Text = string.Format("Uw naam is {0}",this.nameField.Text);
}
}

Wanneer de applicatie wordt gestart wordt bij elke submit de pagina compleet ververst, zie de tijdsindicatie.



Applicatie gestart zonder Atlas functionaliteit




Submit zonder Atlas functionaliteit


Wat je eigenlijk zou willen is dat alleen het formulier wordt ververst en niet de gehele pagina. Met Atlas is dit binnen 5 minuten te realiseren. Allereerst downloaden en installeren we de nieuwste versie van het Atlas Framework. 

Vervolgens kopiëren we de Microsoft.Web.Atlas.dll naar de bin folder van onze applicatie en maken een referentie naar deze DLL.  Deze DLL is te vinden in \Mijn documenten\Visual Studio 2005\Templates\ProjectTemplates\Visual Web Developer\CSharp\ASPNETAtlasWebApplicationCS.zip voor cSharp developers, of Mijn documenten\Visual Studio 2005\Templates\ProjectTemplates\Visual Web Developer\VisualBasic\ASPNETAtlasWebApplicationVB.zip voor de Visual Basic variant.

Voeg aan je system.web sectie van je web.config onderstaande elementen toe

     <pages>
      <controls>
        <add namespace="Microsoft.Web.UI" assembly="Microsoft.Web.Atlas" tagPrefix="atlas"/>
        <add namespace="Microsoft.Web.UI.Controls" assembly="Microsoft.Web.Atlas" tagPrefix="atlas"/>
      </controls>
    </pages>

Dit zijn overigens de minimaal benodigde instellingen. Download hier een volledig voorgeconfigureerde web.config.

Aan de HTML Source voeg ik een Scriptmanager en een Updatepanel toe(in Bold en Italic weergegeven).

<%@ Page Language="C#" AutoEventWireup="true"  CodeFile="Default.aspx.cs"
Inherits="_Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>Een webapplicatie</title>
</head>
<body>
    <form id="wepappForm" runat="server" defaultbutton="submit">
<atlas:ScriptManager  runat="server" ID="scriptMngr" EnablePartialRendering="true" /> 
    <div>
        <asp:Label ID="applicatieInfo" runat="server" Text="" />
        <br /> <br />
        <atlas:UpdatePanel ID="updName" runat="server">
        <ContentTemplate>
            <asp:Label ID="yourName" runat="server" Text="Naam:" />
            <asp:TextBox ID="nameField" runat="server" />
            <asp:Button ID="submit" runat="server" Text="Submit" OnClick="submit_Click" />
            <br /><br />
            <asp:Label ID="typedValue" runat="server" Font-Bold="True" Font-Size="Large" />
        </ContentTemplate>
        <Triggers>
        <atlas:ControlEventTrigger ControlID="submit" EventName="Click" />
        </Triggers>
        </atlas:UpdatePanel>
     </div>
    </form>
</body>
</html>

In een latere blogpost kom ik nog gedetailleerder op de Scriptmanager en Updatepanel terug, maar voor nu is het voldoende om te weten dat de scriptmanager verantwoordelijk is voor de communicatie tussen Atlas controls en code behind files. Het Update panel is verantwoordelijk voor het verversen van de controls die binnen het ContentTemplate element vallen en het doorsluizen van events die binnen het triggers element vallen. 

In ons geval wordt na het drukken op de submit knop Event Click afgevangen, de postback wordt uitgevoerd en het formulier wordt ververst. Nu starten we onze webapplicatie met Atlas functionaliteit



Applicatie gestart met Atlas functionaliteit


 

Submit met Atlas functionaliteit

Constateer dat de datum/tijd dit keer niet veranderd omdat deze buiten het update panel is geplaatst en dus niet ververst wordt. Ook heb ik niks aan mijn codebehind file hoeven aan te passen. Uiteraard is dit slechts basis functionaliteit, maar in een volgende blogpost over Atlas zal ik dieper ingaan op het Framework.

Downloads:
Comments [4] | | # 
Sunday, July 30, 2006 8:59:11 AM (GMT Daylight Time, UTC+01:00) ( Tools )

Op diverse weblogs is al enige tijd te lezen dat Microsoft komt met een documentatie tool, namelijk  Sandcastle. De CTP hiervan is vanaf nu te downloaden.

Sandcastle Overview:

• Produces quality, comprehensive, familiar MSDN-like documentation.
• Works with or without authored comments.
• Supports Generics and .NET Framework 2.0
• Sandcastle has 2 main components (MrefBuilder and Build Assembler)
• MrefBuilder generates reflection xml file for Build Assembler
• Build Assembler includes syntax generation, transformation..etc
• Sandcastle is used internally to build .Net Framework documentation

Sandcastle is zeer welkom, zeker nu de maker van NDoc heeft aangekondigt zijn contributie aan NDOC te stoppen.

Op de weblog van Sandcastle is tevens  een artikel geplaatst waarin wordt uitgelegd hoe je een chm file maakt met gebruik van Sandcastle.

Download Sandcastle
Lees hier de uitleg

Update 30-7-2006 19:43

Lees tevens de FAQ die zojuist geplaatst is.

Comments [0] | | #