maandag 2 maart 2009

Eenvoudig RSS feeds maken in ASP.NET 3.5

In ASP.NET 3.5 is het zeer eenvouding om RSS feeds te maken voor je website. Hieronder probeer ik dan ook eenvoudig uit te leggen hoe je dit snel voor elkaar kunt krijgen:
  1. Voeg aan je web project een nieuw item toe door met de rechter muisknop op het project te klikken en "Add/New item" te selecteren
  2. Selecteer de "Generic Handler" template en geef deze de naam 'rss.ashx'

    Het *.ashx bestand met het code-behind klasse bestand (*.cs) wordt gegenereerd

  3. De klasse implementeert de interface IHttpHandler en de bijbehorende methodes en eigenschappen zijn hierbij reeds aangemaakt.

  4. We gaan nu de methode 'ProcessRequest' aanpassen om een RSS feed in het Response object te schrijven. Verwijder eerst de bestaande voorbeeld code

  5. Om RSS feeds te genereren hebben we een extra reference in het project nodig, namelijk: "System.ServiceMode.Web". Klik in het webproject met de rechter muisknop op 'References' en selecteer "Add Reference". Selecteer in de lijs met .Net componenten het betreffende component.


  6. Maak een instantie van de klasse 'SyndicationFeed':
    SyndicationFeed feed = new SyndicationFeed("RSS titel", "RSS omschrijving", new Uri("http://localhost"));
    Voeg hiervoor de volgende "using directive" (bonvenin de klasse) toe:
    using System.ServiceModel.Syndication;

  7. Voeg (als voorbeeld) twee items aan de RSS feed toe:
    feed.Items = new List
    {
    new SyndicationItem("Item 1", "Het 1e RSS item", new Uri("
    http://localhost/item1.aspx")),
    new SyndicationItem("Item 2", "Het 2e RSS item", new Uri("
    http://localhost/item2.aspx"))
    };

  8. Schrijf de RSS feed naar het Response object:
    using (System.IO.StringWriter output = new System.IO.StringWriter())
    {
    System.Xml.XmlTextWriter writer = new System.Xml.XmlTextWriter(output);
    new Rss20FeedFormatter(feed).WriteTo(writer);
    context.Response.ContentType = "application/rss+xml";
    context.Response.Write(output.ToString());
    }

  9. Als je nu rss.ashx opstart in je webproject dan zul je zien dat er netjes een RSS feed wordt 'gerendert'.

In punt 7 zou je natuurlijk een database (of andere databron) uit kunnen lezen om automatisch RSS items toe te voegen aan je feed.


Succes ermee !!!

vrijdag 20 februari 2009

Drag&Drop Panels oftewel Widgets in ASP.NET

Al enige tijd was ik van plan om "draggable panels" (ook wel widgets genoemd) te ontwikkelen in ASP.NET, zodat ik deze kon gaan gebruiken in een dashboard pagina in de webapplicaties die wij ontwikkelen. Een voorbeeld hiervan zijn de Gadgets in iGoogle:


Natuurlijk heb ik deze techniek niet helemaal zelf ontwikkeld, want er zijn er al genoeg die mij voor zijn geweest... het wiel hoeft immers niet opnieuw uitgevonden te worden. De controls die voor mij het beste in aanmerking kwamen waren de controls die Omar AL Zabir heeft ontwikkeld.
Omar heeft een project ontwikkeld (open source) waarvan je online kan bekijken hoe dit functioneert: http://www.dropthings.com/. De sources van dit project kan je hier downloaden.

Het nadeel van dit open source project is de complexiteit die er aanwezig is, vanwege de vele 'Widgets' die er al inzitten. Ik het dit project uitgekleed tot een project waar alleen de techniek van de Drag&Drop widgets aanwezig is. Met behulp van dit project kan je veel eenvoudiger een start maken om de Widgets verder te ontwikkelen tot je eigen controls.


Laten we beginnen met een voorbeeld filmpje wat bewijst dat het allemaal ook nog werkt:


Dit project is ontwikkeld in ASP.NET 3.5 SP1 en maakt gebruik van het AjaxControlToolkit. Het project bestaat uit de volgende onderdelen:
  • DragControls folder. Hierin staan de AJAX control extenders die Omar heeft ontwikkeld.
  • Default pagina. Deze pagina bevat 2 Panel controls welke ieder 2 Widgets bevat. Hierbij heb ik gebruik gemaakt van standaard ASP.NET controls. Het is natuurlijk netter om uiteindelijk de controls die voor de Widgets zijn gebruikt te verwerken tot 1 custom ASP.NET control óf 1 UserControl
  • Voor elk Panel control waarin Widgets staan is een CustomDragDropExtender toegevoegd aan de pagina. Hierin staat het volgende gedefinieerd:
    TargetControlID: ID van het Panel control welke de Widgets bevat;
    DragItemClass: welke CssClass wordt gebruikt voor het kenmerken van een Widget
    DragItemHandleClass: welke CssClass wordt gebruikt voor het kenmerken van de header van een Widget (dit header element wordt gebruikt om het Widget te Drag&Droppen);
    DropCueID: ID van het control waarin de Widgets in gedropt kunnen worden. Elk Panel wat Widgets kan bevatten heeft een dergelijk Drop control nodig.
    OnClientDrop: hierbij kan een javascript functie aangegeven worden welke uitgevoerd dient te worden, nadat een Widget versleept is
  • Stylesheet. Deze stylesheet bevat alleen die stijlen die gebruikt worden door de Widget functionaliteit
  • WidgetHandler.js. Dit javascript bestand bevat de onDropWidget functie welke aangeroepen wordt nadat een Widget versleept is (OnClientDrop)
    Deze javascript functie maakt gebruik van de WidgetService om hierin de methode MoveWidget aan te roepen.
  • WidgetService. Webservice welke door de Default pagina is toegevoegd aan de ASP.NET ScriptManager. Dit zorgt ervoor dat de WebMethodes in deze WebService beschikbaar komen middels een object model in javascript. De webservice functies zijn dan dus vanuit javascript direct aan te roepen.

Ik heb verder geen implementatie toegevoegd voor het daadwerkelijk verplaatsen van een Widget aan de server zijde. De knoppen voor het verwijderen/sluiten van een Widget zijn wel aanwezig, maar ook deze heb ik niet geïmplementeerd.
Het lijkt me juist beter dat jullie deze functionaliteit zelf implementeren en ik de code in dit project niet vervuil met applicatielogica waar jullie niets aan hebben.

De source code kan je hier downloaden.
Succes ermee !!!


Bronnen:
http://www.dropthings.com/
http://msmvps.com/blogs/omar/archive/2007/03/22/asp-net-ajax-extender-for-multi-column-widget-drag-drop.aspx

dinsdag 10 februari 2009

Bug in ASP.NET ReportViewer van Microsoft


Oplossing
Vandaag (4 maart 2009) heb ik reactie gekregen op mijn feedback. Microsoft heeft het probleem opgelost in Cumulative update package 9 for SQL Server 2005 Service Pack 2 en Cumulative update package 1 for SQL Server 2005 Service Pack 3.

Ik heb in eerste instantie SQL Server 2005 Service Pack 3 geïnstalleerd. Hierna bleek het probleem al direct opgelost te zijn. Óf de Cumulative update package 1 zit al in SP3 óf de installatie van SP3 lost het probleem zelf al op!

Update (9 maart 2009): helaas heeft de update naar SP3 op de (64 bits) productie server niet tot hetzelfde resultaat geleidt. Ook de Cumulatieve Update 1 voor SP3 heeft niet geholpen. Microsoft heeft me gewezen op een blog artikel van Brian Hartman. Ik heb alle updates geïnstalleerd die Brian in zijn artikel noemt (behalve de update voor SharePoint, want daar heb ik in mijn project niets mee te maken), maar ook dit heeft niets geholpen. Ik zal dit opnieuw aan Microsoft melden.

Wordt vervolgd...


In het ReportViewer control van Microsoft, waarmee rapporten van SQL Server Reporting in een web applicatie bekeken kunnen worden , zit een bug.

Indien de beveiligingsupdate voor ActiveX Killbits voor Windows XP (KB956391) is geïnstalleerd op de client computer (in mijn geval Windows XP SP3 met Internet Explorer 7) dan functioneert het printen van een rapport niet meer.
Hierbij volgt dan de volgende foutmelding: "Unable to load client print control". Wanneer je de betreffende update verwijderd, dan is het probleem weer opgelost.

Ik heb hiervoor een bug rapport bij Microsoft Connect ingediend. Je kan deze 'feedback' hier volgen.
Ik houd jullie op de hoogte !!!

maandag 19 januari 2009

Fiedelientje

Mijn vrouw is pas geleden een webwinkel begonnen onder de naam Fiedelientje.

Fiedelientje is een kinderlifestyle webwinkel voor kleine wereldburgertjes. Houdt u van lieflijk, kleurrijk, stippen en ruitjes en niet van een standaard assortiment dan bent u bij Fiedelientje aan het juiste adres. U vind hier artikelen van verschillende leveranciers, maar ook handgemaakte artikelen van eigen ontwerp.

Smallweb heeft hiervoor de webapplicatie ontwikkeld. Wil je ook een webwinkel beginnen, bel of mail ons dan en wij komen graag onze webwinkel demonstreren.

Ik zou zeggen: ga snel eens kijken !!!

maandag 24 november 2008

ASP.NET control voor FusionChart

Op de markt zijn talloze grafiek componenten aanwezig die in ASP.NET webapplicaties geïntegreerd kunnen worden. Persoonlijk zoek ik altijd naar freeware controls, omdat de vraag naar grafieken in een webapplicatie vaak niet van dergelijk belang is dat er (veel) geld voor neergeteld wordt.

Nu heb ik een oplossing gevonden welke gratis is, zeer dynamisch, flexibel... en het ziet er nog fraai uit ook. FusionCharts biedt een oplossing die op Flash (versie 8) gebaseerd is. Het grote voordeel van Flash is natuurlijk dat het cross-browser en cross-platform is. Het nadeel is dat het altijd op de computer van de gebruiker geïnstalleerd moet zijn om er gebruik van te kunnen maken.

Om het gebruik van deze functionaliteit te vereenvoudigen heb ik een ASP.NET (3.5) control ontwikkeld, welke de meest gebruikte functionaliteiten toepast. Het control maakt gebruik van Javascript om de Flash elementen op de pagina toe te voegen.
Een Visual Studio 2008 project kan hier gedownload worden. Dit project bevat het ASP.NET control en een testpagina.

Belangrijke eigenschappen van het control:

  • DataSource: het toekennen van data aan het Flash element geschiedt middels XML. Dit control biedt de mogelijkheid om een IEnumberable DataSource toe te kennen. Deze DataSource zal als XML in de pagina worden toegevoegd
  • DataMemberXAxis: DataMember uit de DataSource die op de X-as gebruikt moet worden
  • DataMemberYAxis: Lijst met één of meerdere DataMembers die op de Y-as gebruikt moet worden.
    Let op: indien er meer dan één DataMember wordt gebruikt, dan dient een correct ChartType toegekent te worden (alle ChartTypes die beginnen met 'MS' kunnen hiervoor worden gebruikt)
  • ChartType: type grafiek die gebruikt moet worden. Elk type maakt gebruik van een ander Flash bestand. Zie de FusionCharts folder in het VS2008 project

Succes ermee !

Bron(nen):
FusionCharts
FusionCharts Documentatie

ASP.NET control voor Google AJAX Search API

Google maakt het mogelijk om (redelijk) simpel hun zoekmachine functionaliteit te integreren in je eigen website. Hiervoor kan je gebruik maken van de Google AJAX Search API.

Deze API kan middels Javascript aangeroepen worden en biedt een AJAX zoekmachine in je eigen website. Om het gebruik van deze functionaliteit te vereenvoudigen heb ik een ASP.NET (3.5) control ontwikkeld, welke de meest gebruikte functionaliteiten van de API toepast.
Een Visual Studio 2008 project kan hier gedownload worden. Dit project bevat het ASP.NET control en een testpagina.

Belangrijke eigenschappen van het control:
  • GoogleApiKey: deze key kan hier worden opgevraagd
  • SearchDefinitions: dit is de lijst met de types Search die je kan integreren op je website. Zie de Google documentatie voor uitleg hiervan. Standaard is het type WebSearch al aanwezig (zie Constructor) in deze lijst.
  • MessageForNoResults: standaard wordt geen melding weergegeven indien Google geen zoekresultaten heeft. Middels deze eigenschap kan je toch een melding laten weergeven
  • NoDefaultCss: standaard voegt Google zelf HTML styles toe aan de Google elementen op je pagina. Wanneer je deze eigenschap op False zet wordt dit niet gedaan en kan je je eigen styles gebruiken (door je juiste class names in je stylesheet op te nemen).

Succes ermee!

Bron(nen):
Google AJAX Search API
Documentatie Google AJAX Search API

vrijdag 31 oktober 2008

Verbergen van Next / Previous controls in ASP.NET WizardControl

Vandaag had ik een probleem met het verbergen van de Next / Previous links/buttons van een ASP.NET WizardControl.

Hierbij liep ik tegen 2 problemen aan:
  1. Middels de standaard methode FindControl op het WizardControl object kan de betreffende LinkButton niet gevonden worden. Hiervoor het ik zelf een FindControl methode gemaakt, welke hieronder is bijgevoegd
  2. Het aanpassen van de eigenschap [LinkButton].Visible naar False blijkt niet te werken. Waarschijnlijk negeert het WizardControl deze eigenscap in de eigen Render methode. In plaats van de Visible eigenschap kan je de Style eigenschap gebruiken:
    [LinkButton].Style["display"] = "none";

De code behorende bij punt 1 (deze methode zoek recursief, binnen een container control, naar het control met het betreffence ID):

public static Control FindControl(string controlID, Control container) 
{
foreach (Control ctrl in container.Controls)
{
if (ctrl.ID != null && ctrl.ID.Equals(controlID))
return ctrl;
if (ctrl.HasControls())
{
Control c = FindControl(controlID, ctrl);
if (c != null) return c;
}
}
return null;
}

Een voorbeeld van het verbergen van de Next link op de eerste Wizard Step:

WebControl = FindControl("StartNextLinkButton", this.wizardControl1) as WebControl;
nextLink.Style["display"] = "none";

Bronnen: Microsoft MSDN