torsdag den 29. januar 2015

Ændre ID i ASP.NET Webforms i Repeater ødelægger ViewState


Jeg vidste det faktisk godt, men tænkte mig ikke om og nu er det for sent fordi der er lavet så meget baseret på denne model så det kan ikke ændres.

Husk for guds skyld ikke at ændre ID'er på ting fra din repeater når det kommer ud, for så smadrer du alt logik for ASP.NET Webforms når du skal klikke på en knap og få alt tilbage - for så ved den pludseligt ikke hvilke kontroller der er hvad.
Den kan ikke selv mappe det tilbage fordi ID'erne har ændret sig i forhold til hvad den ville give dem, så den mapper dem ikke ind i ASP.NET og det kan give dig en masse problemer.

Så hvis du har brug for fx at vide hvilket nummer, version, udgave, årstal noget er knyttet til, så lav en attribut på elementet som du ved hvad hedder og send det så afsted. Så sikrer du dig at du ikke laver ændringer i det som ASP.NET Webforms forsøger at lave så smart.

Hvis man bare undgår at ændre de ting som ASP.NET selv laver om så er du sikker, og blot tænker over hvordan det kan løses uden at være knyttet op på ID, så kan du lave din egen attribut med MyID="53154" og finde den på det.

Repeater vil ikke opdatere til ny værdi liste med DataBind (ASP.NET Webforms)


Jeg har en side (ASP.NET Webforms) hvor den sætter en liste med data til en repeater.
I _ItemDataBound() ændres navnene fordi de skal have specielle værdier i. Jeg burde faktisk gøre det anderledes, men mere om det i et andet indlæg.
Når man så forsøger at registrere en ydelse med pris 0 skal den returnere et script der giver en popup der spørg om du vil opdatere med 0 fordi de vil blive automatisk fjernet.

Problemet er så at fordi jeg ændrer navnene på kontrollerne så virker viewstate ikke når den kommer tilbage (den kan ikke mappe chkBox_53152, til Mine_priser_Form1_PageHeaderControl_pnlMinePriser_Checkbox53152 - det lange navn ASP.NET selv laver for alt - så den kommer ikke tilbage i repeateren).

Så i Load sættes der ALTID default listen (med det der er gemt før), fordi ellers kan den ikke finde noget i Repeateren fordi så har den ikke nogle item (Nok fordi den ikke kan mappe dem tilbage). Der laves både Datasource = liste og DataBind() for at Click kan finde forskelle i repeateren.
Efter load udføres Click hvori den finder ud af hvilke elementer der har forskelle. Disse ligges ind i listen så listen nu er med de opdaterede værdier fra repeateren og der sættes igen Datasource = liste og DataBind() på samme repeater.

Når man så kommer til _ItemDataBound() så finder den de oprindelige værdier (fordi de er binded første gang), selvom jeg senere har lavet en anden DataBind() med en anden Datasource.

Det var jo et stort problem, men viste sig at jeg kunne "cleare" det som er DataBind'et.

Ved at sige
repeater = new Repeater()
repeater.Datasource = newList
repeater.DataBind()

så kan man få den nye liste igennem.

For mig er det underligt at den ikke overskriver det som er databinded tidligere, fordi du er jo ikke kommet til render endnu og derfor kan nå at ændre tingene, men åbenbart kun hvis man "clearer" det som er DataBind'et.

Så husk at du kan sætte din repeater til at være en ny, og den vil dermed glemme alt du har binded (VB.NET) på den, og så sætte den til det nye så virker det.

tirsdag den 27. januar 2015

Få alt i dit netværk til at snakke sammen


Jeg må indrømme at jeg er ikke ret stærk i netværk.
I øjeblikket har vi fullrate som leverandør og det kan godt give lidt udfordringer for netværket, fordi de har deres egen router som skal være den første som alt går igennem. Denne router har ikke særligt god dækning, plus har ikke porte nok til alt det jeg har brug for.

Det optimale i dette scenarie er at uanset om du sidder på dit tv, eller din mobil, eller tablet, eller bærbare så kan alle få fat i det du har delt på netværket - såsom filer fra din NAS (netværksharddisk), eller printere fx. Det giver dig nogle helt unikke arbejdsmetoder fordi du kan sidde ved din stationære i kontoret, gemme et dokument på din NAS, og så gå ind på din tablet og arbejde videre i sofaen. Eller du har mulighed for at uanset om det er på din mobil, tablet eller tv eller medie afspiller så vil du kunne få vist jeres feriebilleder nemt og overskueligt.
Din musik kan afspilles af alle enheder på netværket, nemt og effektivt.

Jeg har haft problemer med at få enhederne til at enten kunne snakke sammen og dele data og tilgå hinandens delte data, eller også at få forskellige enheder på nettet. Havde oplevet at der var nogle gange hvor jeg kunne søge efter data på Google og få en liste, men kunne ikke få vist de sider og links jeg valgte. Så søgeresultatet kunne google vise, men siderne jeg ville se og klikkede på fik bare et null response som om der ikke kom noget data igennem.

Nu har jeg endeligt fået det til at virke med min ASUS AC87U router.
Første punkt ind er min Zyxel VMG8928-B10A.
 - Port 1 --> NUC (Kablet forbindelse for hastighed og stabilitet) [Hvid]
 - Port 2 --> Synology NAS [Blå]
 - Port 3 --> Zyxel switch (Metal) [Grå]
 - Port 4 (LAN/WAN) --> ASUS AC87U router (Til dens gule port1 som hedder teaming port) [Gul]

I min ASUS AC87U er der ikke forbundet andet, men den sørger så for at give ordentlig trådløs dækning og sørge for at enheder på netværket kan snakke med alle de enheder der er sat i Zyxel routeren. Fx kan jeg via min mobil se det jeg har min NAS via deres apps. Så den kan gå via det fælles netværk til NAS'en.

I min Zyxel switch (Metal) har jeg:
- Port 1 --> Zyxel router (Kablet fra Zyxel routeren) [Grå]
- Port 2 --> Forlænger kabel der ikke længere bruges til noget. [Hvid hvor tappen er knækket af så kan ikke sidde fast ved at klikke sig fast]

Dette gør at NUC'en kan gå på nettet og kan snakke sammen med NAS'en om delte filer, min bærbare kan gå på det trådløse og lave forbindelse til et netværksdrev til at vise fotos fra NAS'en. Mobilerne kan få adgang til NAS'en via de apps Synology giver, fordi de kan få adgang igennem netværket. Jeg kan endda via min mobil få adgang til Kodi (XBMC) via Yatse (En app til at vise medier fra Kodi (XBMC)), og Kodi (XBMC) er placeret på NUC'en. Så mobilen kan gå til ASUS-routeren via det trådløse, som går til Zyxel routeren, som går via kablet forbindelse til NUC'en, som kan fortælle hvilke medier vi har på der.

fredag den 23. januar 2015

Langsom router kan give langsomt internet


For godt og vel et halvt års tid siden kontaktede jeg Fullrate som er min internet udbyder, fordi den router jeg fik med fra dem ikke kunne række ordentligt i vores hus.
Her fik jeg fortalt det var den bedste router de havde, og det endte med jeg gik ud selv og købte en bedre for at forbinde den til den eksisterende, som nu giver god dækning overalt.

Desværre for mig kan jeg ikke bruge denne som den første router ind i huset, fordi så kræver det en fast ip ifølge Fullrate som koster noget ekstra hver måned - det er jeg ikke interesseret i.

Så i forrige weekend gik nettet, selvfølgelig en søndag hvor man ikke kan ringe til dem.
De kunne ikke se der var noget problem, og de ville sende en tekniker og en ny router i tilfælde af der var problemer med den gamle.
Jeg påpeger at hvis han kommer om to dage og han sender det med pestDK, så kommer den jo nok ikke inden han kommer.
Jo jo for han skal komme imellem 8 og 17, og give lyd 45 minutter inden han kommer så jeg kan nå hjem til ham fra arbejde. Det fine er jo så at han mener også jeg kan nå at tage på posthuset og hente den - hvor man ikke kan afhente den samme dag som den er forsøgt leveret.
Så den kommer til mit arbejde hvor jeg har mulighed for at få den og tage med hjem.

Dagen oprinder og manden kommer.. FRA MORGENSTUNDEN! Vi var faktisk på vej ud af døren, så var lidt af en overraskelse og faktisk ret fint og flot.
Desværre kunne han jo så konstatere min router var død fordi han kunne få forbindelse, men han kunne ikke sætte den op og teste den fordi den var ikke engang forsøgt leveret endnu.

Samme dag på mit arbejde kan jeg så hente den router han skulle ha brugt, og hjem kommer jeg med stor skuffelse. Det er en router fra Fullrate de påstår er deres bedste router - nemlig en Zyxel P-2601HN-F1, til min store skuffelse. Jeg har haft routeren i noget der ligner 2 år.
Nu brænder den af, alt for hurtigt - en router skal kunne holde mere end 2 år.
Snakker så med en kollega som siger dem har han haft 2-3 af, og han har fået en bedre med ac-dækning og det hele. DET ER MEGET BEDRE og den havde han ikke haft problemer med, plus han faktisk kunne mærke og se en forskel i båndbredden den fik igennem.
Den sidste del var jeg lidt skeptisk med fordi jeg tænkte enhver router kan klare de 10-13 mbit jeg kører med for det er så lavt.

Nu har jeg fået den bedste de har som er en Zyxel VMG8924-B10A.
Jeg er SÅ overrasket for det er som om den er 10 gange så god! Kan rent faktisk se en reel forskel i det leverede på trods af det trådløse kører igennem en anden end denne router og hele tiden har gjort det. Så selve routeren får bare mere igennem hurtigere.

Kan se hvis jeg skal se ting på netværket såsom musik, film, billeder, backups etc så går der ikke 5-6 sekunder med at finde ud af hvad der er på netværket - nej det kommer efter 1 sekundt ca.
Det samme med websider - de kommer pling med det samme som de bør med den hastighed hvor de før var lidt halvsløve.
Så hvis du kører med en hurtigere router FÅR du faktisk i nogle tilfælde mere ud af dit internet.

torsdag den 22. januar 2015

Fejlhåndtering i C#.NET (ASP.NET)


Der er rigtigt mange måder at lave fejlhåndtering på, og skrevet tons af bøger og teorier om hvornår det er godt at bruge try-catch, null-returnering som identifier, eller state koder og meget meget mere.
Nogle mener at try-catch er effektivt fordi du kan pakke exceptions ind i hinanden, og andre mener det er skidt fordi det er "dyrt" at lave det.

Jeg personligt har fundet et system jeg synes fungerer rigtigt godt, som involverer man altid har et ResponseObject til ALLE metoder. Det vil sige du har et base object med response kodes, succes-property, eller hvad du nu ønsker at have til at identificere dine kald.

Personligt bruger jeg en Succes-property, og en ErrorCode-property som kan sættes til en enumerator. Hvis man så sender denne enumerator til et fejlmodul finder den teksten for den så du kan returnere den.

Så skal man selvfølgelig lave forskellige objekter alt efter hvad man ønsker at returnere, så du får et object af den type med tilbage du ønsker. Skal det være et array, en boolean, en liste, et objekt eller hvad du nu har behov for.

Fordelen for mig er helt klart at du kan ændre dit base-response object som du ønsker - så du kan have fx i dit fejl modul have en GetSystemErrorMessage (fx en MSSQL fejl), og en GetUserErrorMessage (fx "Der skete en fejl da regninger skulle hentes. Kontakt venligst West Inc. på 87 56 43 21").
Således kan du skrive en sigende besked i din log når der sker en fejl, hvor du kan se der ikke er forbindelse til databasen, og til brugeren kan du give en passende fejlbesked de forstår som ikke er så teknisk.

Der kan jo være mange forskellige typer fejl med filen er låst, du har ikke adgang til netværksdrevet, og meget meget mere - og dermed nemmere at skelne imellem hvad skal du gøre nu - skal du forsøge igen, eller ved du at der ikke er mere at gøre? Det er også nemmere at fortælle brugeren noget mere sigende.

tirsdag den 6. januar 2015

Visual studio kan ikke finde ny property eller metode


Dette er et meget velkendt problem, at du i en klasse laver en ny property eller metode, og går over hvor den skal bruges men din intellisense i Visual Studio vil ikke lade dig bruge den, for den mener ikke objektet har denne property eller metode.
Nogle gange hjælper en byg, men ikke altid - hvilket kan være frustrerende fordi man kan se den virkeligt er der.

Der er to ting der kan afhjælpe:


  1. Lukke begge filer, åbne den med property/metode i, bygge hele projektet, åbne filen hvor du skal bruge det objekt med den nye property/metode, og bygger igen. Dette kan være fordi at intellisense til tider ikke opdateres før du lukker en fil.
  2. Gå ind under "Temporary ASP.NET Files", og slette de midlertidige byg filer. Dette er fordi at der kan ligge en tidligere udgave af den fil du har lavet en ny property/metode i, som Visual Studio mener den skal bruge i stedet for. Stien dertil er ofte: C:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files
Det har hjulpet mig, og kan være nogle underlige scenarier man kommer ud i at en clean og byg ikke er nok, men ovenstående to har hjulpet mig med problematikken før.