Felsök: Sys.ArgumentNullException: Value cannot be null

Något av det värsta som finns är att debugga Ajax-funktioner. AJAX Control Toolkit kan slänga ur sig en del väldigt konstiga felmeddelanden och de är inte lätta att lösa. Tänkte nu börjar dokumentera dem innan jag blir allt för galen.

Nyss fick jag detta i IE7:

Error: Sys.ArgumentNullException: Value cannot be null. Parameter name: element

På Firefox visas ett ändå mer förbryllande meddelande:

Sys.ArgumentNullException: Value cannot be null. Parameter name: element Sys$CultureInfo$_getAbbrMonthIndex("")ScriptRe...=15a6fa0c (line 6391) ScriptResource.axd?d=Mp3wOTv2U48tSwOzRbx9I5sb41bR8P9ogeRdPKRzZ5RBTNpXVRJNcEL9psPGosr4vyEbYVFfS05BUAtE2hlW2Q2&t=3004b210()()ScriptRe...=3004b210 (line 499) [Break on this error] this._upperAbbrMonths = this...s.dateTimeFormat.AbbreviatedMonthNames);

Googlade och började förstå att det hade med ModalPopupExtender att göra.

Min såg ut så här:

<ajaxToolkit:ModalPopupExtender ID="uxAddToProductModalPopupExtender" runat="server" TargetControlID="modaldummy" PopupControlID="uxAddToProductPanel" BackgroundCssClass="modalBackground" CancelControlID="uxCancelAddToProduct">
</ajaxToolkit:ModalPopupExtender>

Lite längre ner på sidan ligger knappen som visade sig vara boven i dramat.

<asp:Button runat="server" ID="uxCancelAddToProduct" Text="Stäng" Visible="false" />

Den var gömd med Visible="false" och skapade alltså null-exception i extendern. Sätter jag Visible till true få försvinner felet.

By Jesper Lind

Buggsök: Tid i textBox med CalendarExtender

En bloggeditor spelade spratt med oss. Tiden i datumet då det postades ändrades till midnatt (00:00:00) då och då. Trodde först det var nån databas-grej, men när jag debuggade så kom jag på att vår ajax-kalender var felinställd. Så här såg den ut.

<asp:TextBox Font-Size="10px" ID="uxPublishedDate" Width="100"
         Text='<%# Bind("PublishedDate") %>'
         runat="server" />
         <ajaxToolkit:CalendarExtender runat="server"
         ID="CalendarExtender1"
         TargetControlID="uxPublishedDate"
         Format="yyyy-MM-dd HH:mm:ss">
         </ajaxToolkit:CalendarExtender>

När jag tog bort Format="yyyy-MM-dd HH:mm:ss" fungerade det bättre och tiden behölls.

By Jesper Lind

Flera Visual Studio-projekt i samma Solution

Försökte just att skapa en "blank solution" i Visual Studio 2008 men den vägrade att låta mig ladda in mer än ett projekt.

Efter ett tag förstod jag att mina inställningsfiler hade återställts till default pga av mappbyte. Hittade tips hos Paul June om hur man skulle ställa in det rätt igen.

Gå till Tools/Options/Projects and Solutions och klicka i rutan "Always show solution".

By Jesper Lind

Så fixar man AJAX-felet 'Sys' is undefined på IE6

Om man kör ASP.NET AJAX på en sajt kan man få javascript-felet 'Sys' is undefined. Detta beror på att IE6 har problem med en komponent för att ladda de komprimerade skripten.

Problemet sägs vara lagat i senare släpp av AJAX-ramverket men jag fick felet nyligen (på Loopias webbhotell). Om detta uppstår kan man helt enkelt stänga av komprimeringen helt som jag läste här. Detta görs genom att lägga till följande i Web.Config.

<system.web.extensions>
<scripting>
<scriptResourceHandler enableCompression="false" enableCaching="true" />
</scripting>
</system.web.extensions>

By Jesper Lind

Om SessionID ändras vid varje request

Det här gör jag fel på cirka en gång per år, så dags att spara till det lite mer permanenta blogg-minnet.

Om du använder SessionID i ASP.NET, tänkt på att det skapas ett nytt vid varje request, så länge du inte har sparat något annat värde. Så tror jag inte det fungerade med klassisk ASP så det är lätt att göra fel.

För att få samma SessionID vid varje omladdning får man alltså gör något liknande detta.

if (Session["MySessionSaver"] == null)
Session["MySessionSaver"] = "1";

lbl.Text = Session.SessionID;

Skyll alltså inte på att webbhotellet har fel på sina serverar.. Tack till Loopia's support för att ni fick mig på rätt spår.

By Jesper Lind

Undvik konverteringsfel med nullvärden från databasen

IBland får jag felet "Input string was not in a correct format." vid funktioner enligt nedan och det finns null-värde i databasen.

<%# GetUser(Convert.ToInt32(DataBinder.Eval(Container.DataItem, "UserId"))) %>

Då kan man göra så här för att parera nullvärdena och istället skicka in en nolla.

<%# GetUser(Eval("UserId") == DBNull.Value ? 0 : Convert.ToInt32(Eval("UserId"))) %>

Eller i Code Behind:

int userId = objDataReader["UserId"] == DBNull.Value ? 0 : Convert.ToInt32(objDataReader["UserId"]);

By Jesper Lind

Snabb Firefox på localhost och eliminera minnesläckande tillägg

Firefox kan gå riktigt långsamt när man kör den inbyggda web servern i Visual Studio. Tydligen kan detta bero på DNS-problem relaterat till IPv6. Om man sätter network.dns.disableIPv6 till false i about:config så ska det gå bättre.

Andra källor till seghet kan vara att tillägg man har installerat inte fungerar optimalt. Som tur är har Leak Monitor utvecklats för att kunna spåra såna minnesläckor i tillägg. Just fick jag passande upp den första rapporten från tillägget, när jag skriver detta. Det presenteras i en Javascript-popup där man kan spåra problemet och se vilket tillägg som läckt minne.

Cybernet News har gjort en undersökning med hjälp av Leak Monitor och presenterar en sammanställning på några tillägg man ska se upp för.

By Jesper Lind

Mailsnurr med Loopia och egna servrar

Tänkte skriva en rad om en begränsning med Loopia's webbhotell-paket som jag fick erfara för ett tag sen. Det står ingenting i deras kunskapsdatabas om detta, så jag vill hjälpa andra som försöker göra samma sak i framtiden, genom att ge lite råd.

Det jag försökte var att genom deras LoopiaDNS peka ett domännamn till våra egna namnservrar. Detta fungerade mycket bra och hemsidan kördes fint.

Men vi ville även kunna använda Loopia's e-postsystem för samma domän och det var här problemen började.

Jag la till följande två MX-pekare i DNS-inställningarna på våra servrar:

Mailforward1.loopia.se
Mailforward2.loopia.se

När jag sedan försökte skicka mail till det konton fick jag tillbaks följande felmeddelande (mailadresserna är påhittade):

Hi. This is the qmail-send program at s20.loopia.se.

I'm afraid I wasn't able to deliver your message to the following addresses.
This is a permanent error; I've given up. Sorry it didn't work out.

<reciever@website.domain>:
194.9.94.245 failed after I sent the message.
Remote host said: 554 too many hops, this message is looping (#5.4.6)

--- Below this line is a copy of the message.

Return-Path: <sender@website.domain>
Received: (qmail 99621 invoked from network); 17 Aug 2007 01:43:41 -0000
Received: from s4.loopia.se ([194.9.94.245])
(envelope-sender <sender@website.domain>)
by s20.loopia.se (qmail-ldap-1.03) with SMTP
for <reciever@website.domain>; 17 Aug 2007 01:43:41 -0000
Received: (qmail 52798 invoked from network); 17 Aug 2007 01:43:41 -0000
Received: from s20.loopia.se (194.9.94.3)
by s4.loopia.se with SMTP; 17 Aug 2007 01:43:41 -0000
Received: (qmail 99305 invoked from network); 17 Aug 2007 01:43:39 -0000
Received: from s4.loopia.se ([194.9.94.245])
(envelope-sender <sender@website.domain>)
by s20.loopia.se (qmail-ldap-1.03) with SMTP
for <reciever@website.domain>; 17 Aug 2007 01:43:39 -0000
Received: (qmail 52791 invoked from network); 17 Aug 2007 01:43:39 -0000
Received: from s20.loopia.se (194.9.94.3)
by s4.loopia.se with SMTP; 17 Aug 2007 01:43:39 -0000
Received: (qmail 98985 invoked from network); 17 Aug 2007 01:43:36 -0000
Received: from s4.loopia.se ([194.9.94.245])
(envelope-sender <sender@website.domain>)
by s20.loopia.se (qmail-ldap-1.03) with SMTP
for <reciever@website.domain>; 17 Aug 2007 01:43:36 -0000
....

Detta är bara början på meddelandet det fortsätter i ca 100 hopp, i en slags evighetsloop.

Vid kontakt med supporten fick jag detta svar.

Domänen måste peka mot våra namnservrar för att du ska få vidarebefordringen att fungera genom att det är en konfiguration på vår namnserver som gör att det är vi som måste "hosta" domännamnet.

Så därför vill jag klargöra för andra som tänker försöka sig på samma sak. Det går INTE att använda Loopias e-post om du väljer att använda egna namnservrar.

By Jesper Lind

Validera CheckBox med CustomValidator

Försökte att lägga till en RequiredFieldValidator för att kontrollera att en CheckBox var ikryssad vid postning, men det gick inte så bra. Felet blev:

Control 'CheckBox1' referenced by the ControlToValidate property of
'RequiredFieldValidator1' cannot be validated.

Någonstans läste jag att man inte lagt till denna möjlighet på CheckBox för att "bägge värdena alltid är riktiga". Det kanske kan vara ett bra argument, men jag ville endå ha denna funktionelitet. I mitt fall gällde det en ruta som användaren måste kryssa i för att fortsätta.

Så jag gjorde det med en CustomValidator istället, så här ser uppmärkningen ut på sidan.

<asp:CheckBox id="CheckBox1" runat="server"></asp:CheckBox>
<br />
<asp:CustomValidator ClientValidationFunction="ValidateChecked"
Runat="server" ID="termsReadUnchecked" ErrorMessage="You must tick this box to continue"/>

Och i koden bakom lägger jag till JavaScript-funktionen för valideringen.

HtmlGenericControl validateCheckedScript = new HtmlGenericControl("script");
validateCheckedScript.Attributes.Add("type", "text/javascript");
validateCheckedScript.InnerHtml = "function ValidateChecked(src, args){args.IsValid=document.getElementById(\"" + ChckBox1.ClientID + "\").checked;}";
this.Page.Header.Controls.Add(validateCheckedScript);

By Jesper Lind

Skicka mail med IIS på din lokala maskin

Har ägnat nån timme åt att försöka skicka mail med SMTP-servern i IIS 5.1 och nu lyckats få iväg några mail. Här går jag igenom de steg jag fick göra för att få det att fungera.

Mailkoden

Själva mailkoden jag använder i applikationen använder System.Net.Mail och ser ut ungefär så här:

SmtpClient smtpClient = new SmtpClient("localhost");
//smtpClient.DeliveryMethod = SmtpDeliveryMethod.PickupDirectoryFromIis;
MailAddress from = new MailAddress("from@dummysite.domain", "Alias from name");
MailAddress to = new MailAddress("to@dummysite.domain");
MailMessage mail = new MailMessage(from, to);
mail.IsBodyHtml = true;

mail.Subject = "From my local computer";
mail.Body = "Testing, testing";

smtpClient.Send(mail);

"SmtpDeliveryMethod.PickupDirectoryFromIis" var något jag trodde behövdes ett tag, eftersom jag läste om det på ett forum, men det visade sig att det gick bra att skicka även utan.

Ställa in SMTP-Server

Det problemet kom i form av ett felmeddelandet som såg ut så här:

Mailbox unavailable. The server response was: 5.7.1 Unable to relay for ...

Lösningen till detta hittade jag på CodeBetter och innebar att lägga till 127.0.0.1 som giltigt IP-nummer för att skicka mail från SMTP-server. (Egenskaper / Åtkomst / Anslutning / Endast datorer i listan nedan)

När detta var klart så försökte jag skicka igen, nu fungerade det i applikationen men mailen fastnade i C:\Inetpub\mailroot\Queue.

Lösningen på detta fann jag på Velocityreviews där medlemmarna förklarade att man behövde lägga till en giltigt SMTP från sin ISP. (Egenskaper / Leverans / Avancerat / Smart värd)

Hoppas detta kan hjälpa någon som vill kunna skicka mail från sin egen dator med ASP.NET.

By Jesper Lind