Höll på att testa lite med att koppla en XMLDataSource till en DropDownList och stötte på lite problem. Jag fick följande felmeddelande:
System.Web.UI.WebControls.XmlDataSourceNodeDescriptor innehåller inte någon egenskap med namnet name.
Efter lite sökning på nätet kom jag underfund med att det inte går att ange DataTextField till ett fält-värde i xml-filen. Det ska vara attribut till en tagg för att det ska fungera. Här är ett exempel på den xml fil som jag testade med som för övrigt är genererad av an tjänst på www.geonames.org och visar "first-order administrative division" Sverige. Jag ville få fram alla län men tror inte detta var helt rätt. Resten av parametrarna som man kan skicka med finns på en lista, här.
Jag hittade lösningen som jag använder på Raj Kaimal's blogg. För att transformera xml-filen ovan så att name blir ett attribut till geoname kan man använda en XSLT-fil (TransformGeonames.xsl) som ser ut så här.
På André Henriksson's blogg läser jag att den första betan av ASP.NET AJAX V1.0. Det som innan kallades "Atlas". En väldigt glad nyhet, nu blir det äntligen till att börja prova på allvar med den nya spännande tekniken. Nu ska jag ta och installera det på mina en av mina maskiner med en gång. Releasen består av tre olika delar som går att ladda ner här.
"Core-biblioteket" som är basfunktionaliteten som du laddar ner här
"Extensions" som är utökningen som kan förändras med olika releaser som du laddar ner här
Jag stötte på lite problem när jag skulle formatera valuta i ett templatefield i en GridView. Decimalerna ändrade sig inte alls även fast jag var säker på att jag använt rätt formatering. Talet 0 visade sig som 0,0000 kr. Efter lite googlande hittade jag lösningen på mitt problem på The Ensoft blog. Man ska ange HtmlEncode="false" för att formateringen ska fungera.
Följande exempel visar en formatering med två decimaler.
AFA-Afghanistan Afghani ALL-Albanian Lek DZD-Algerian Dinar ARS-Argentine Peso AWG-Aruba Florin AUD-Australian Dollar BSD-Bahamian Dollar BHD-Bahraini Dinar BDT-Bangladesh Taka BBD-Barbados Dollar BZD-Belize Dollar BMD-Bermuda Dollar BTN-Bhutan Ngultrum BOB-Bolivian Boliviano BWP-Botswana Pula BRL-Brazilian Real GBP-British Pound BND-Brunei Dollar BIF-Burundi Franc XOF-CFA Franc (BCEAO) XAF-CFA Franc (BEAC) KHR-Cambodia Riel CAD-Canadian Dollar CVE-Cape Verde Escudo KYD-Cayman Islands Dollar CLP-Chilean Peso CNY-Chinese Yuan COP-Colombian Peso KMF-Comoros Franc CRC-Costa Rica Colon HRK-Croatian Kuna CUP-Cuban Peso CYP-Cyprus Pound CZK-Czech Koruna DKK-Danish Krone DJF-Dijibouti Franc DOP-Dominican Peso XCD-East Caribbean Dollar EGP-Egyptian Pound SVC-El Salvador Colon EEK-Estonian Kroon ETB-Ethiopian Birr EUR-Euro FKP-Falkland Islands Pound GMD-Gambian Dalasi GHC-Ghanian Cedi GIP-Gibraltar Pound XAU-Gold Ounces GTQ-Guatemala Quetzal GNF-Guinea Franc GYD-Guyana Dollar HTG-Haiti Gourde HNL-Honduras Lempira HKD-Hong Kong Dollar HUF-Hungarian Forint ISK-Iceland Krona INR-Indian Rupee IDR-Indonesian Rupiah IQD-Iraqi Dinar ILS-Israeli Shekel JMD-Jamaican Dollar JPY-Japanese Yen JOD-Jordanian Dinar KZT-Kazakhstan Tenge KES-Kenyan Shilling KRW-Korean Won KWD-Kuwaiti Dinar LAK-Lao Kip LVL-Latvian Lat LBP-Lebanese Pound LSL-Lesotho Loti LRD-Liberian Dollar LYD-Libyan Dinar LTL-Lithuanian Lita MOP-Macau Pataca MKD-Macedonian Denar MGF-Malagasy Franc MWK-Malawi Kwacha MYR-Malaysian Ringgit MVR-Maldives Rufiyaa MTL-Maltese Lira MRO-Mauritania Ougulya MUR-Mauritius Rupee MXN-Mexican Peso MDL-Moldovan Leu MNT-Mongolian Tugrik MAD-Moroccan Dirham MZM-Mozambique Metical MMK-Myanmar Kyat NAD-Namibian Dollar NPR-Nepalese Rupee ANG-Neth Antilles Guilder NZD-New Zealand Dollar NIO-Nicaragua Cordoba NGN-Nigerian Naira KPW-North Korean Won NOK-Norwegian Krone OMR-Omani Rial XPF-Pacific Franc PKR-Pakistani Rupee XPD-Palladium Ounces PAB-Panama Balboa PGK-Papua New Guinea Kina PYG-Paraguayan Guarani PEN-Peruvian Nuevo Sol PHP-Philippine Peso XPT-Platinum Ounces PLN-Polish Zloty QAR-Qatar Rial ROL-Romanian Leu RUB-Russian Rouble WST-Samoa Tala STD-Sao Tome Dobra SAR-Saudi Arabian Riyal SCR-Seychelles Rupee SLL-Sierra Leone Leone XAG-Silver Ounces SGD-Singapore Dollar SKK-Slovak Koruna SIT-Slovenian Tolar SBD-Solomon Islands Dollar SOS-Somali Shilling ZAR-South African Rand LKR-Sri Lanka Rupee SHP-St Helena Pound SDD-Sudanese Dinar SRG-Surinam Guilder SZL-Swaziland Lilageni SEK-Swedish Krona TRY-Turkey Lira CHF-Swiss Franc SYP-Syrian Pound TWD-Taiwan Dollar TZS-Tanzanian Shilling THB-Thai Baht TOP-Tonga Pa'anga TTD-Trinidad&Tobago Dollar TND-Tunisian Dinar TRL-Turkish Lira USD-U.S. Dollar AED-UAE Dirham UGX-Ugandan Shilling UAH-Ukraine Hryvnia UYU-Uruguayan New Peso VUV-Vanuatu Vatu VEB-Venezuelan Bolivar VND-Vietnam Dong YER-Yemen Riyal YUM-Yugoslav Dinar ZMK-Zambian Kwacha ZWD-Zimbabwe Dollar
Omdöme Tjänsten från WebserviceX.NET verkar väldigt bra. När jag provade SEK till GBP fick jag kursen 7.29 för 100 svenska. Jämnförde med min resaomväxlare och där är kursen just nu 7.25. På x-rates.com är kursen 7.25937. Alla tjänster som jag använt hittills har skiljt sig från andra källor. Varför vet jag inte med marginalerna är ganska små och därför duger det bra till en ungefärlig omräkning.
Nu skulle det vara intressant att sätta ihop det hela med Asp.Net RegionInfo för att automatiskt läsa av vilken kurs som ska hämtas beroende på besökarens inställningar. Men det får bli i en senare artikel.
Uppdatering: Web servicen som används i detta exemplet verkar inte finnas kvar längre på nätet.
Inspirerad av en artikel om växelkurser på Code Project har jag gjort ett eget exempel. Jag använder en web service som finns xmethods.net.
Registrera tjänsten Först måste man använda Visual Studio till att lägga till en referens till servicen.
1. Högerklicka på rooten i Solution Explorern 2. Välj "Add Web Reference" 3. Skriv in url till tjänsten. I vårt fall: http://www.xmethods.net/sd/2001/CurrencyExchangeService.wsdl 4. Skriv in "Web Reference Name". Vi döper den till Rate_WS 5. Då skapas en ny mapp som heter "App_WebReferences" i projektet.
När du har gjort ovanstående så kan man använda tjänsten från sin kod. Här följer ett enkelt exempel som skriver ut några växelkurser.
<body> <div id="content"> <b>Currency example using web service</b> <br /><br />
1 US Dollar = <asp:Label ID="lblDollar_Sek" runat="server" /> SEK <br /><br /> 1 Euro = <asp:Label ID="lblEuro_Sek" runat="server" /> SEK <br /><br /> 1 Euro = <asp:Label ID="lblEuro_Dollar" runat="server" /> US Dollar <br /><br /> 1 SEK = <asp:Label ID="lblSek_Yen" runat="server" /> Yen
</div> </body> </html>
Länk till sida som visar kurser i real-tid (Exemplet är nedtaget eftersom web servicen inte längre finns på nätet)
Mer läsning: Läs även den danska bloggen Walk the walk som i ett exempel konsumerar en tjänst på Webservicex.net. Den verkar bra eftersom man anger valutabetäckningen (SEK, USD, DKK osv) som inparameter.
Detta är ganska irriterande. Försöker använda ControlParameter för att hitta en DropDownList i min GridView. Men måste då ange det fullständiga Id enligt följande.
Då kan jag bara komma åt en viss rad, i exemplet ovan den som har index 3. Detta är ju fullkomligt idiotiskt, det måste finnas en lösning. Här finns en artikel där en av läsarna skriver om samma problem i kommentarerna.
En alternativ lösning Jag har inte kommit på hur man kan göra med problemet ovan. Det är nog helt enkelt så naming containers fungerar i Asp.Net. Istället gjorde jag en metod som hittar DropDownListan och lägger till parametern från koden bakom.
I och med lanseringen av ASP.NET 2.0 har Microsoft fokuserat mer på att följa webbstandarderna. På MSDN finns en artikel som handlar om hur man gör sajter i som följer webbstandarderna.
Jag har börjat använda Web.sitemap flitigare i mina applikationer. asp:Menu komponenten är ju smidig eftersom den är så lätt att binda till en SiteMapDataSource och menyn ritas fram automatiskt.
Men jag stötte dock på en del problem som jag inte vet hur man kan lösa. För det första genererar den onödigt mycket kod med mängder av nästlade tabeller och det är väldigt svårt att lista ut hur man ska få den att uppföra sig precis som man vill.
Sen ville jag ha streckade linjer som separatorer och använde StaticBottomSeparatorImageUrl för att ange min bild. Kunde dock inte komma på hur man kan göra för att bara ha dem imellan menylänkarna. Inte före eller efter med andra ord.
Efter ett stunds sökning på nätet gav jag upp. Hittade istället en djupgående artikelserie på www.devx.com där nio problem med sajt navigation tas upp. Där hittade jag ett tips om hur man kan binda ihop en Repeater till sin SiteMapDataSource istället för Menu kontrollen. Men hjälp av Repeatern kunde jag placera separator koden där jag ville samt att få hela menyn att renderera snyggare utan massa överflödiga tabeller.