Atlas version 1.0

Microsoft meddelar att ramverket Atlas version 1.0 kommer att släppas innan nästa version av Visual Studio och planeras finnas tillgänglig innan årets slut.

Ramverket kommer då byta namn. Klientkoden kommer att kallas "Microsoft AJAX Library" och serverkoden "ASP.NET 2.0 AJAX Extensions".

Atlas Control Toolkit kommer också att byta namn och det kommer kallas "ASP.NET AJAX Control Toolkit".

By Jesper Lind

Mysko fel med referens till User Control

Ibland så slutar mina applikationer helt plötsligt att hitta referensen till vissa User Controls. Vet inte exakt varför men läs om hur man kan råda bot på det. En bugg i IIS? Eller jag som bytt namn på filerna på felaktigt sätt? Nu senast hände det på produktionsservern medans koden fungerade utan problem på min lokala maskin.

Jag registrerat följande klassnamn i min User Control

<%@ Control ClassName="MyControl" %>

Så här ser delen av koden ut som felet uppstår i.

public partial class Product : System.Web.UI.Page, System.Web.UI.ICallbackEventHandler
{
//Instanser av klasser
protected MyControl myControl;//<---Här blir det fel
. . .

Felet i debugg texten.

Compilation Error
Description: An error occurred during the compilation of a resource required to service this request. Please review the following specific error details and modify your source code appropriately.

Compiler Error Message: CS0246: The type or namespace name 'MyControl' could not be found (are you missing a using directive or an assembly reference?)

Lösningen
Ja detta är verkligen ett mysko fel som tycks ha uppstått slumpmässigt för mig typ tre gånger. Hittills har jag löst det genom att undersöka "Show Detailed Compiler Output:" i debuggtexten och hittat sökvägen till de temporära Asp.Net filerna. Sen har jag raderat alla filer i den mappen för applikationen och sen försvinner felet. Mappen låg på typ denna sökvägen på servern.

C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files\root\re432432\h3423423

Frågan är bara - hur gör man om man själv inte har tillgång till servern? Om man ligger på ett vanligt webbhotell? Då blir det till att fråga supporten om hjälp antar jag.

By Jesper Lind

Wizards med Asp.Net

Att göra sidor som ska utföra vissa bestämda steg kan vara krångligt. Man får då själv hålla reda på vilket steg man är genom sessions-variabel eller viewstate, och programmera när paneler ska visas/gömmas själv. I Asp.Net har vi den nya Wizard-kontrollen som tar hand om allt detta för dig genom ett trevligt interface.

Tyvärr är inte rendereringen den bästa och det blandas hej vilt mellan inline CSS (<td style="height:100%;">, etc) och attribut på taggarna (td align="right", cellspacing, cellpadding, etc). Inte det lättaste att få den att se ut som man vill med andra ord. Läser ibland om andra som klagar på detta. För er som är trötta på hur kontrollerna i Asp.Net för det mesta ritas upp med tabell-layout kan jag rekommendera de Css-vänliga versioner av .NET kontrollerna. Tyvärr har de ingen adapter för Wizards ännu.

Men förutom rendereringen så är det en utmärkt kontroll läs mer på Beansoftware.com som tillhandahåller en bra guide om hur man använder den.

By Jesper Lind

Lägg till valideringsuttryck dynamiskt

Så här kan man göra för att lägga till en textbox med en valideringskontroll på en PlaceHolder. Man får max skriva in 255 stycken giltiga tecken och då räknas även mellanrum. Det regulara uttrycket (heter det så på svenska?) hittade jag här i ett forum.


//Skapa en textbox för att skriva in namn på kategorien på det speciella språket
TextBox tb = new TextBox();
tb.ID = "textbox";
tb.CssClass = "standardTextbox";

placeHolder.Controls.Add(tb);

//Lägg till validering
RegularExpressionValidator rev = new RegularExpressionValidator();
rev.ControlToValidate = "tb";
rev.ValidationExpression = @"[\w\s]{0,255}";

rev.Display = ValidatorDisplay.Dynamic;
rev.Text = " * Max antal tecken är 255!";
placeHolder.Controls.Add(rev);

Vill man släppa lite på teckenkontrollen och tex tillåta () "" så kan man byta ut mot följande uttryck.

[\S\s]{0,255}

By Jesper Lind

Felsök: Kalender visar inte valt datum

Detta hör till en av de saker som man kan få problem med vid uppdatering från ramverk 1.1 till 2.0. Symptomet är att markeringen inte syns för vilken dag som är vald. För att få detta att fungera i 2.0 måste man ändra koden enligt följande.

Detta brukade gå bra i 1.1

calendar.SelectedDate = DateTime.Now;

I ramverket 2.0 måste nyckelordet "Today" användas

calendar.SelectedDate = DateTime.Today;

By Jesper Lind

Sätt upp ett RSS-flöde

RSS står för Really Simple Syndication och är en XML-dialekt som följer XML 1.0-specifikationen. RSS är av de nya beståndsdelarna i den "nya webben" och har blivit väldigt populärt på senare tid. Användare kan med egna RSS-läsare, prenumenera på innehåll från en webbplats. Fördelen är enorm genom att man kan från en samlad plats se exakt vilka av ens favoritsajter som har skrivit något nytt. RSS skapar även möjligheten för olika nyhetssajter att publicera innehåll från en annan webbsida.

Jag använde artikeln "Skapa en RSS-feed för din webbplats" som inspiration. Jag skrev om den för att passa till ASP.NET C# samt att jag i mitt kodexempel skriver en fysisk xml fil direkt på hårddisken. I exemplet på Dileno.com läggs xml-filen i cache. Min funktion som skapar ett RSS-flöde av posterna i min blogg och ser ut ungefär så här.

//Funktion som skapar RSS flöde
protected void GenerateRss()
{
try
{

//Fysisk sökväg på servern (Byt ut mot den på din server)
string strXMLPath = "C:/ . . . /rss.xml";

FileStream objFileStream = new FileStream(strXMLPath,FileMode.Create);
XmlTextWriter xtw = new XmlTextWriter(objFileStream,System.Text.Encoding.GetEncoding("iso-8859-1"));
xtw.Formatting = Formatting.Indented;
xtw.WriteStartDocument();

//skriv ut <rss version="2.0">
xtw.WriteStartElement("rss");
xtw.WriteAttributeString("version","2.0");

//skriv ut <channel>
xtw.WriteStartElement("channel");

//skriv ut element som tillhör <channel>
xtw.WriteElementString("title","Codeodyssey.se");
xtw.WriteElementString("link","http://www.codeodyssey.se/");
xtw.WriteElementString("description","Code Odyssey - expanderar webben");
xtw.WriteElementString("language","sv-SE");
xtw.WriteElementString("copyright","Copyright (c) 2004-2006 Code Odyssey");

OleDbConnection conn = new OleDbConnection (strConn);
bool boolPermission = false;
OleDbDataReader objDataReader=null;
try
{
string strSQL = "SELECT Blog.Id, Blog.Title, Blog.Body, Blog.PublishDate FROM Blog ORDER BY Blog.PublishDate DESC";

conn.Open();

OleDbCommand objCommand = new OleDbCommand(strSQL, conn);
objDataReader = objCommand.ExecuteReader();
while (objDataReader.Read() == true)
{
int Id = Convert.ToInt32(objDataReader["Id"]);
string Title = Convert.ToString(objDataReader["Title"]);
string Body= Convert.ToString(objDataReader["Body"]);
//Se till att datum följer RFC-822 standard
string PublishDate = Convert.ToString( ((DateTime)objDataReader["PublishDate"]).ToString("r"));


//skriv ut <item> och dess innehåll
xtw.WriteStartElement("item");
xtw.WriteElementString("title",Title);
xtw.WriteElementString("link","http://www." + strUrl.ToLower() + "/Blog.aspx?id=" + Id);
xtw.WriteElementString("guid","http://www." + strUrl.ToLower() + "/Blog.aspx?id=" + Id);
xtw.WriteElementString("description",Body);
xtw.WriteElementString("pubDate",PublishDate);
xtw.WriteEndElement();
}
objCommand.Dispose();
}
catch (Exception objException)
{
Trace.Warn("GenerateRss() Fel!",objException.Message);
}
finally
{
if(objDataReader!=null)
{
objDataReader.Close();  
}
conn.Close();
}

//skriv ut </channel>
xtw.WriteEndElement();

//skriv ut </rss>
xtw.WriteEndElement();

//Stäng xml skrivaren
xtw.Close();
}
catch (Exception objException)
{
Trace.Warn("GenerateRss() Fel!",objException.Message);
}
}

Visa RSS för läsaren
Sen är det dags att lägga till en länk så att Firefox (och antagligen IE7) ska kunna se att din webbplats innehåller ett RSS-flöde och visa detta med den lilla RSS ikonen.

Denna tagg ser ut så här:

<link rel="alternate" type="application/rss+xml" title="RSS 2.0" href="xml/rss.xml" />

Vill man lägga till en länk till RSS från koden kan man göra så här:

//Lägg till RSS länk
HtmlLink link = new HtmlLink();
link.Attributes.Add("type", "application/rss+xml");
link.Attributes.Add("rel", "alternate");
link.Attributes.Add("href", "feed/rss.xml");
this.Page.Header.Controls.Add(link);

Bilder i RSS?
Först tänkte jag visa de bilder i mitt RSS-flöde men efter ha läst "RSS - bra eller dåligt?" så ångrade jag mig. Speciellt om man ska prenumenera på RSS genom en mobiltelefon så vill man ju inte ladda med en massa bilder i onödan.

Validera bloggen
Till sist är det dags att prova så att allt fungerar som det ska. Mozilla Thunderbirds inbyggda RSS läsare fungerar utmärkt till detta. Eller aktiva bokmärken i Firefox. Man bör även validera CSS-flödet, en valideringstjänst finns på Feedvalidator.org.

By Jesper Lind

Felsök: Ogiltigt återanslag- eller återanropselement.

Jag har stött på följande fel några gånger. Det uppstår ofta när man utför AJAX-operationer och byter ut innehållet i komponenter. Speciellt med rullistor har jag problem. Här hittade jag ett forum med några teorier.

Hela felmeddelandet

Ogiltigt återanslag- eller återanropselement. Händelseverifiering aktiveras med <pages enableEventValidation="true"/> i konfigurationen eller <%@ Page EnableEventValidation="true" %> på sidan. Av säkerhetsskäl verifierar denna funktion att argumenten till återanslående- eller återanropshändelser kommer från den serverkontroll som ursprunligen renderade dem. Om data är giltiga och förväntade, bör du använda metoden ClientScriptManager.RegisterForEventValidation för att registrera verifieringsdata.

En enkel lösning kan vara att stänga av event valideringen helt i web.config eller på själva sidan. Men det kan ju vara dumt att gå miste om den extra säkerheten. Injektionsattacker är något att se upp för och event valideringen är till för att skydda mot dessa.

Stänga av i konfigurationen

<system.web>
<pages enableEventValidation="false"/>
</system.web>

Stänga av på en enskild sida

<%@ Page EnableEventValidation="false" ... %>

På OdeToCode.com finns artiklar som beskriver vad Event Validation gör och en till där problemet diskuteras ytterligare.

By Jesper Lind

Hur gör man URL-omskrivning med ASP.NET?

Att ha med .aspx-ändelsen och massa querystring-parametrar på webbadresser känns lite klumpigt ibland, och inte så bra ur sökoptimerings-synpunkt. IIS6 med ASP.NET 2.0 har inte något inbyggt sätt att göra detta. Jag menar istället för för att ha en lång url som "Blog.aspx?year=2006&month=09" är det ju trevligare med "blog/2006/09".

I Ruby on Rails är omskrivning av URL:er enkelt och en naturlig del av språket. På Apache servrar finns mod_rewrite som äe en bra modul för alla PHP-utvecklare.

Med Asp.Net kan man använda HttpContext.RewritePath men det är inte så lätt som man först kan tro. Jag hittade mängder av artiklar om olika lösningar men många beskrev problem med cachning, themes och problem med PostBack.

Urlrewriting.net finns det en open source komponent som sägs ha löst många av dessa problem. Har dock inte provat den själv.

Jag har även läst en del info om att det kommer finnas bättre stöd för detta när IIS 7.0 kommer.

Fler blandade referenser
http://weblogs.asp.net/fmarguerie/archive/2004/11/18/265719.aspx
http://www.aspnetpro.com/NewsletterArticle/2003/09/asp200309pj_l/asp200309pj_l.asp. http://www.developersdex.com/gurus/articles/793.asp?Page=3 http://www.webforum.nu/showthread.php?t=145530. http://www.raftweb.info/SEO/1032.aspx

By Jesper Lind

Inkludera Javascript i head med Asp.Net

Så här gör man för att inkludera Javascript inuti head-taggen genom kod i Asp.Net.

HtmlGenericControl Include = new HtmlGenericControl("script"); Include.Attributes.Add("type", "text/javascript"); Include.Attributes.Add("src","FilSomSkaInkluderas.js"); this.Page.Header.Controls.Add(Include);

Eller för att lägga till en kodsnutt.

HtmlGenericControl Include2 = new HtmlGenericControl("script"); Include2.Attributes.Add("type", "text/javascript");
Include2.InnerHtml = "alert('JavaScript inuti Page Header');"; this.Page.Header.Controls.Add(Include2);

Glöm inte att skriva in runat-attributet på head-taggen

<head runat="server">

Hittade även en artikel om hur man kan få Visual Studio att gruppera javascriptfiler under .aspx-filen i Solution Explorer. Krävs dock ett tillägg i register-nycklarna. Snälla VS utvecklare - lägg till detta direkt i programmet.

By Jesper Lind