<meta http-equiv='pics-label' content='(pics-1.1 "http://www.icra.org/ratingsv02.html" comment "ICRAonline EN v2.0" l gen true for "http://interval.cz" r (nz 1 vz 1 lz 1 oz 1 cz 1) "http://www.rsac.org/ratingsv01.html" l gen true for "http://interval.cz" r (n 0 s 0 v 0 l 0))' />
<h2>Strßnky pro r∙znß za°φzenφ na jednΘ adrese v ASP.NET</h2>
<p id='prepend'>S pomocφ rozÜφ°enφ .net Frameworku pro mobilnφ za°φzenφ m∙₧eme na n∞kolika °ßdcφch vytvo°it spolehliv² redirektor, kter² u₧ivatele p°esm∞ruje v₧dy na nejvhodn∞jÜφ verzi strßnek pro jeho za°φzenφ. Na rozdφl od podobnΘ funkce v PHP, o kterΘ jsme ji₧ psali, za nßs cel² mechanismus detekce typu a schopnostφ za°φzenφ toti₧ provede .net Framework sßm.</p>
<p>Je pot°eba si °φct, ₧e v∙bec nejde o jedin² zp∙sob, jak nabφzet jednu aplikaci pro vφcero za°φzenφ. DalÜφ mo₧nostφ m∙₧e b²t rozÜφ°enφ <a href='http://msdn.microsoft.com/library/default.asp?url=/library/en-us/mwsdk/html/mwlrfMobilePageClass.asp'>System.Web.UI.MobileControls.MobilePage</a>. Zßkladnφ aplikace je pak v₧dy funkΦnφ vÜude i p°es urΦit² "spartßnsk² vzhled", viz nap°φklad Φlßnek <a href='http://interval.cz/clanek.asp?article=2429' title='R∙₧iΦka, Pavel: Internetov² Φas prost°ednictvφm mobilu v ASP.NET'>Internetov² Φas prost°ednictvφm mobilu v ASP.NET</a>. ╪eÜenφm je za°azenφ takzvan²ch <a href='http://msdn.microsoft.com/library/en-us/mwsdk/html/mwconusingdevicespecifictemplates.asp'>DeviceSpecific Üablon</a>, tak₧e lze pohodln∞ vytvo°it aplikaci, kterß se velmi flexibiln∞ p°izp∙sobuje mo₧nostem za°φzenφ.</p>
<p>P°edem m∙₧eme rovnou °φci, ₧e princip zde popisovanΘ aplikace je analogick² <a href='http://interval.cz/clanek.asp?article=892' title='R∙₧iΦka, Pavel: WWW, WAP a PDA na jednΘ adrese pomocφ PHP'>popisovanΘ aplikaci vyu₧φvajφcφ PHP</a>. Zjistφme typ a schopnosti za°φzenφ a podle toho nastavφme URL pro nßslednΘ p°esm∞rovßnφ, Φφm₧ ·loha celΘ aplikace konΦφ. SystΘm .net Framework mß velmi komplexnφ rozÜφ°enφ pro mobilnφ za°φzenφ v prostoru nßzv∙ <code>System.Web.Mobile</code>, dovede rozpoznat velkΘ mno₧stvφ za°φzenφ, a tak se k≤d aplikace scvrkne jen na zavedenφ pot°ebnΘho prostor∙ nßzv∙, zφskßnφ ·daj∙ o schopnostech za°φzenφ a rozhodovacφ Φßst <code>switch</code>. Na zßv∞r si jeÜt∞ ukß₧eme, jak .net Framework "nauΦit" rozpoznat novΘ za°φzenφ, kterΘ sßm o sob∞ rozpoznat nedovede.</p>
<p>Vychßzφme z p°edpokladu, ₧e v²chozφ strßnka <em>Default.aspx</em>, kterß zajiÜ¥uje detekci a p°esm∞rovßnφ, bude v ko°eni serveru a na zßklad∞ detekce p°esm∞ruje u₧ivatele do jinΘho adresß°e nebo na jinou strßnku. K≤d aplikace je opravdu trivißlnφ, proto si jej rovnou popφÜeme (<a href='podklady/ruzicka/623/wwwwapaspnet.zip'>zdrojov² k≤d ukßzek</a>):</p>
<p>V direktivßch strßnky (<a href='http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpgenref/html/cpconpage.asp'>Page</a>) vidφme zablokovanΘ funkce pro udr₧ovßnφ stavov²ch informacφ, kterΘ jsou pro naÜi aplikaci zbyteΦnΘ a jen by ubφraly systΘmovΘ prost°edky serveru. Je zaveden pot°ebn² prostor nßzv∙ <code>System.Web.Mobile</code>.</p>
<p>V²konnß Φßst sestßvß z obsluhy udßlosti <code>Page_Load</code>, kterß <a href='http://interval.cz/clanek.asp?article=1972' title='Jirava, Jaroslav: Äivotnφ cyklus ASP.NET strßnky'>nastane p°i zavßd∞nφ strßnky na serveru</a>. Zde si ulo₧φme zφskanΘ schopnosti za°φzenφ (<a href='http://msdn.microsoft.com/library/default.asp?url=/library/en-us/mwsdk/html/mwlrfmobilecapabilitiesclass.asp'>MobileCapabilities</a>) z vlastnosti <code>Request.Browser</code>. Dßle si nastavφme prom∞nnou udßvajφcφ °et∞zec URL, kam se bude p°esm∞rovßvat - v²chozφ hodnotu nastavφme na adresu naÜφ webovΘ strßnky, urΦenΘ pro b∞₧nΘ prohlφ₧eΦe osobnφch poΦφtaΦ∙. Z vlastnosti <a href='http://msdn.microsoft.com/library/en-us/mwsdk/html/mwproismobiledeviceproperty.asp'>IsMobileDevice</a> urΦφme, zda se jednß o mobilnφ za°φzenφ. Pokud ano, podle vlastnosti <a href='http://msdn.microsoft.com/library/en-us/mwsdk/html/mwlrfpreferredrenderingtypeproperty.asp'>PreferredRenderingType</a> rozhodneme, jakΘ schopnosti za°φzenφ mß.</p>
<p>Pokud za°φzenφ tvrdφ, ₧e umφ zobrazit HTML k≤d verze 3.2, jeÜt∞ navφc ov∞°φme, zda Üφ°ka displeje je v∞tÜφ ne₧ dvacet znak∙ nebo zda nejde o za°φzenφ typu Pocket PC. To zjistφme z vlastnosti <a href='http://msdn.microsoft.com/library/en-us/cpref/html/frlrfSystemWebHttpBrowserCapabilitiesClassBrowserTopic.asp'>Browser</a> a u n∞kter²ch za°φzenφ p°φmo jako rozpoznan² model z vlastnosti <a href='http://msdn.microsoft.com/library/en-us/mwsdk/html/mwlrfmobiledevicemodelproperty.asp'>MobileDeviceModel</a>. Pokud za°φzenφ vyhovφ t∞mto podmφnkßm, nastavφme URL na specißlnφ verzi naÜich strßnek vhodnou pro tato za°φzenφ (nap°φklad poΦφtaΦ s mobilnφm telefonem typu MDA). Pokud podmφnkßm nevyhovuje, jde z°ejm∞ o za°φzenφ s dostateΦn∞ velk²m displejem a proto adresu pro p°esm∞rovßnφ m∞nit nebudeme - ponechßme v²chozφ a klient bude p°esm∞rovßn na b∞₧nou webovou verzi. Obdobn∞ potom rozhodneme o p°esm∞rovßnφ za°φzenφ, kterß podporujφ takzvanΘ compact HTML, WML verze 1.1 a verze 1.2. Zda budou adresy stejnΘ nebo rozdφlnΘ zßle₧φ na tom, kolik verzφ mßme p°ipraven²ch.</p>
<p>Oproti <a href='http://msdn.microsoft.com/library/en-us/mwsdk/html/mwlrfpreferredrenderingtypeproperty.asp'>popisu v MSDN</a> vracφ vlastnost <code>PreferredRenderingType</code> navφc jeÜt∞ dv∞ novΘ hodnoty, <code>xhtml-basic</code> a <code>xhtml-mp</code>. Tyto se t²kajφ p°edevÜφm nov²ch mobilnφch telefon∙ - naÜe ukßzkovß aplikace je sice "poÜle" na tutΘ₧ verzi jako klasickΘ wapovΘ telefony, ka₧dopßdn∞ je pot°eba se zab²vat i t∞mito hodnotami. Pokud bychom je v aplikaci neoÜet°ili, budou u₧ivatelΘ takov²ch telefon∙ posφlßni na v²chozφ strßnku urΦenou pro desktopovΘ prohlφ₧eΦe.</p>
<p>ProblΘmem mobilnφch za°φzenφ je, ₧e ne vÜechna podporujφ cookies a pokud by je aplikace na za°φzenφ odeslala, m∙₧e dojφt k selhßnφ zobrazenφ. Bohu₧el tedy musφme vypnout pou₧φvßnφ cookies pro session. Rovn∞₧ tak je pot°eba, aby URL, kterou ASP.NET generuje v hlaviΦce pro p°esm∞rovßnφ, byla skuteΦn∞ absolutnφ, jak definuje norma RFC. Obojφ zajistφme <a href='http://interval.cz/clanek.asp?article=2233' title='Kopp, Ond°ej: KonfiguraΦnφ parametry aplikace v ASP.NET'>nastavenφm v souboru Web.config</a>. Nastavenφ chovßnφ mechanismu session je globßlnφ (nelze nastavit pro location nebo v pod°φzenΘm adresß°i), proto je lepÜφ, kdy₧ webovß verze strßnek bude umφst∞na v podadresß°i, pro kter² je vytvo°ena zvlßÜ¥ virtußlnφ aplikace, abychom zde mohli sessions vyu₧φvat se vÜφm komfortem vΦetn∞ cookies.</p>
<p>Pot°ebnΘ nastavenφ v konfiguraΦnφm souboru <em>Web.config</em>:</p>
<p>Pro zlepÜenφ p°enositelnosti aplikace by se hodilo URL jednotliv²ch verzφ p°ebφrat z vlastnφch hodnot v souboru <em>Web.config</em> jako ve v²Üe odkazovanΘm Φlßnku, v naÜem p°φkladu je URL uvedeno napevno p°φmo v k≤du aplikace pouze z d∙vodu nßzornosti a p°ehlednosti.</p>
<p>Pokud se stane, ₧e mßme za°φzenφ, kterΘ .net Framework nerozpoznß sprßvn∞, nenφ problΘm popsat jeho vlastnosti do zvlßÜtnφho konfiguraΦnφho souboru do sekce <strong>browserCaps</strong>. V naÜem p°φkladu nadefinujeme fiktivnφ za°φzenφ <em>Interval MDA</em> do souboru <em>Interval.Mda.config</em>:</p>
<p>Hodnoty jednotliv²ch vlastnostφ samoz°ejm∞ m∙₧eme stanovit ruΦn∞, pro usnadn∞nφ se vÜak hodφ pou₧φt online <a href='http://www.asp.net/mobile/profile/default.aspx'>Device Profiler</a> na strßnkßch <a href='http://www.asp.net/'>ASP.NET</a>. S jeho pomocφ snadno otestujete vlastnosti a mo₧nosti za°φzenφ a nakonec se vytvo°φ kompletnφ definice <code>browserCaps</code>.</p>
<p>Zb²vß si jen ukßzat, jak dßme .net Frameworku vlastnosti naÜeho za°φzenφ na v∞domφ. Do ko°enovΘho souboru <em>Web.config</em> nebo do hlavnφho konfiguraΦnφho souboru <em>Machine.config</em> p°idejte nßsledujφcφ definici do sekce <code>system.web</code> a p°ihrajte vytvo°en² definiΦnφ soubor:</p>
<div class='sample'>
<system.web>
<br /> <browserCaps>
<br /> <file src="Interval.Mda.config" />
<br /> </browserCaps>
<br /></system.web>
</div>
<p>Podobn²ch definicφ je, jak vidno, mo₧nΘ p°idat libovoln² poΦet - nicmΘn∞ se hodφ Φas od Φasu sledovat updaty, zda nenφ k dispozici <a href='http://www.asp.net/mobile/deviceupdate.aspx?tabindex=6'>update definic mobilnφch za°φzenφ</a>, abychom vlastnφ definicφ nenosili d°φvφ do lesa.</p>
<p><span class='note-redactor'>Pozn. red.: Tento Φlßnek vyÜel poprvΘ 18. 9. 2003. P∙vodnφ verze <a href='podklady/ruzicka/623/akt_623_clanek_20030918.zip'>Φlßnku</a> a k n∞mu vedenΘ <a href='podklady/ruzicka/623/akt_623_diskuse_20030918.zip'>diskuse</a> jsou vßm k dispozici v ZIP archivech.</span></p>
<div class='page-right-box reading'><h3 title='NejΦten∞jÜφ Φlßnky za poslednφch 7 dn∙'>NejΦten∞jÜφ</h3><div class='page-right-box-in'><ul><li><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz/clanek.asp?article=3549'>Hrßtky s okrajem textu v CSS</a></li><li><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz/clanek.asp?article=3527'>Manußly aneb Jak jsem se nauΦil ned∞lat si starosti a mφt rßd internet</a></li><li><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz/clanek.asp?article=3528'>PφÜeme pro web - odliÜte se od konkurence</a></li><li><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz/clanek.asp?article=3546'>Zamezenφ vφcenßsobnΘho odeslßnφ formulß°e JavaScriptem</a></li><li><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz/clanek.asp?article=3550'>Nßvrh aplikacφ v jazyce UML - textovß specifikace p°φpad∙ u₧itφ</a></li></ul></div></div><div class='page-right-box cauldron'><h3 title='Nejdiskutovan∞jÜφ Φlßnky za poslednφch 21 dn∙'>Diskuznφ kotel</h3><div class='page-right-box-in'><ul><li><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz/clanek.asp?article=3533' title='(55 komentß°∙)'>Editory pro webdesignΘry - velk² programßtor</a></li><li><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz/clanek.asp?article=3529' title='(40 komentß°∙)'>Zaklφnadla na spam</a></li><li><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz/clanek.asp?article=3527' title='(22 komentß°∙)'>Manußly aneb Jak jsem se nauΦil ned∞lat si starosti a mφt rßd internet</a></li><li><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz/clanek.asp?article=3517' title='(21 komentß°∙)'>PφÜeme pro web - podle Φeho se zßkaznφci rozhodujφ</a></li><li><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz/clanek.asp?article=3549' title='(16 komentß°∙)'>Hrßtky s okrajem textu v CSS</a></li></ul></div></div>