daron yöndem | Microsoft Regional Director | Silverlight MVP
Microsoft Regional Director | Silverlight MVP

Sonunda Ankara WebCamp'i de yaptık! :) Neden "Sonunda" diyorum çünkü bu ikinci denememiz oldu. İlkinde uçak havaalanına inemeyip Samsun'a geçince :) etkinliği iptal etmek zorunda kalmıştık. İkinci denemede kara rağmen pek bir sorun olmadı :) ve dün Ankara WebCamp etkinliğini güzelce tamamladık.

Ankara WebCamp'den bir kare..
Ankara WebCamp'den bir kare..

WebCamp boyunca hızlıca Nuget, HTML5, Windows Phone, Azure gibi konulara göz attık. Özellikle HTML5 tarafında kullandığım örnekleri aşağıdan indirebilirsiniz.

WebCamp HTML5 Örnek Kodlar - HTML5.rar (12.59 MB)

Uzun süre olmuş Ankara'ya gitmeyeli o nedenle epey güzel oldu benim için böyle bir ziyaret. Umarım katılan herkes için de faydalı olmuştur. Unutmadan, INETA Ankara etkinliği ile iki haftaya tekrar Ankara'da olacağız bu sefer çok daha geniş bir ekiple. Kaçırmayın derim ;)

İzmir'den sonra INETA Türkiye büyük etkinliklerine Ankara ile devam ediyor :) Bilgileri aşağıda ;)

INETA Ankara Etkinliği
INETA Ankara Etkinliği

Etkinliğe buradan kayıt olmayı unutmayın ;) Ha tabi hazır duyurulardan bahsederken :) 25 Ocak'ta bir de WebCamp var Microsoft'ta. Orada da olacağım. Görüşmek üzere!

Geçen gün son bir yıldır yaptıklarımla ilgili MVP nominasyonu için rapor hazırlıyordum. Evet, tabi bilmeyenler için ufak bir açıklama yapiyim burada :) veya yapmiyim siz hızlıca şuradaki yazılara bir göz atın. Özetle, MVP programı için kişilerin değerlendirilmesi sürecinde Microsoft "ne yaptın geçen bir senede gönüllü olarak" diye bir soruyor. Aslında soru bu kadar basit değil, ölümcül detaylı bir rapor hazırlamanız ve herşeyi kanıtlamanız vs vs gerekiyor (Benim hazırlamam bir gün sürdü... şaka değil). Peki bunlardan size ne :) Konuya geliyorum....

İşte tam da bu hazırlıkları yapıp son bir sene boyunca yaptıklarıma, yazdıklarıma baktım da... o arada aklıma geldi... Neden ben her sene çıkardığım bu raporların özellikle teknoloji eğilimiyle ilgili kaba bir sonucunu yayınlamıyorum? Böylece aslında ilginç bir şekilde yıllar arasındaki gidişatı da görebiliriz. Aslına bakarsanız ben de kendi vardığım sonuca şaşırdığım için bunu paylaşmak istedim. Bakalım önümüzdeki yıllarda da bu şekilde raporları paylaşabilirsem bir gün dönüp 5-10 yıla topluca bakmak ilginç olabilir :)

2011 Yılı İlgi Alanlarım
2011 Yılı İlgi Alanlarım

Yukarıda gördüğünüz sonuç sadece gönüllü yaptığım seminerler, yazdıklarım vs ile ilgili ama ilginç bir şekilde paralı iş hayatım diyebileceğim kısımla da çok ciddi şekilde paralel bir sonuç var ortada :) Bu kadar doğru bir rapor çıkabileceğini tahmin etmiyordum. Sonuç beni hem bu açıdan şaşırttı hem de yüzdeleri yazılı görmek değişimin farkına varmam adına hafif bir dürtükleme etkisi yarattı :)

İlginç sonuçlar...

  1. En ilginci WPF ile neredeyse hiç uğraşmamış olmam. Gerçekten geriye dönüp baktığımda belki de en kökleri sağlam, Windows'un göbeğinde oturan WPF ile uğraşmamış olmam ilginç. Daha ilginci şimdi düşünüyorum da WPF ile ticari olarak de hiç proje yapmadım son bir senede...
  2. Windows 8'in daha bu kadar erkenken ve Eylül'de elimize birşeyler ulaşmışken %8'i kapması da ilginç :)
  3. Windows Azure tarafının %21'yi bulduğunu tahmin etmiyordum. Ticari tarafta bu yüzde şu an çok daha yüksek, özellikle son 6 aydır... ama ürünün Türkiye'ye gelmemiş olması nedeniyle çılgın paylaşımlarda bulunamadım. Buna rağmen %21 cidden yüksek bir yüzde. Demek ürün gelse :) neler neler olacak...
  4. Silverlight tarafı yüksek gibi gözükse de önceki senelere göre benim hissiyatım oranın düştüğü yönünde. Elimde tabi ki net istatistik yok :) İleriki yıllarda bu çalışmam sayesinde bu gibi durumları net istatistiklerden konuşabiliriz. Ama içimdeki hissiyat o yönde. Bunun nedeni tabi ki "SL Öldü" dedikoduları yüzünden değil :) Tam tersine ürünün olgunlaşıp yavaş yavaş "öğrenme/ustalaşma" sürecinden "kullanma" sürecine geçilmesi ile alakalı.

Bakalım seneye neler olacak ;) yine bu zamanlar yayınlarım herhalde raporumu ;)

Kendinize çok iyi bakın.

Diyelim ki Silverlight tarafında kullanıcıdan bir müzik dosyası alıyorsunuz. Aldığınız bir dosyanın DRM ile telif haklarının korunup korunmadığını nasıl anlarsınız :) İşte tam da bu soruya cevap ararken hazır cevabı buldum hemen paylaşiyim istedim blogdan da ;)

Hemen sahneye bir MediaElement alıyorsunuz. Malum zaten müzikle ilgilendiğimiz için görsel olarak birşey gözükmeyecek ama video ile uğraşanlarınız için basit bir şekilde MediaElement Collapsed hale getirilebilir. Kullanıcıdan aldığınız kontrol edilmesi gereken dosyayı direk Source olarak MediaElement'e verip Play diyorsunuz :) Tabi bunu yapmadan önce MediaElement'in Volume'u sıfırlamayı da unutmayın :)

[C#]

public MainPage()
{
    InitializeComponent();
    btn.Click += new RoutedEventHandler(btn_Click);
    mymedia.CurrentStateChanged += new RoutedEventHandler(mymedia_CurrentStateChanged);
    mymedia.MediaFailed += new EventHandler<ExceptionRoutedEventArgs>
                                                    (mymedia_MediaFailed);
}

void mymedia_CurrentStateChanged(object sender, RoutedEventArgs e)
{
    if (mymedia.CurrentState == MediaElementState.Individualizing || 
        mymedia.CurrentState == MediaElementState.AcquiringLicense )
    {
        MessageBox.Show("DRM'li bu dosya!!");
    }
}

void mymedia_MediaFailed(object sender, ExceptionRoutedEventArgs e)
{
    MessageBox.Show("Beklenen bir hata oluştu :P");
}

İşte bu kadar :) MediaElement'in CurrentStateChanged eventinde MediaElement'in CurrentState'ine bakıp durumu anlayabilirsiniz. Individualizing aslında DRM istemcisinin indirildiği anlamına geliyor, AcquiringLicense ise malum lisansın alındığını tanımlıyor. Tabi biz zaten DRM'le korunan içerik oynatmayacağımız için lisans sunucusu gibi ayarları yapmadık ama MediaElement'in bu state'lere düşmesi zaten bir lisans sunucusuna ulaşmaya çalıştığı anlamına geliyor. Malum bu sürecin şu durumda tabi ki bir anlamı yok :) ama bizim eldeki dosyanın DRM'li olup olmadığını anlamamız için yeterli!

Kolay gelsin ;)

Hatırlayacaksınız :) geçenlerde INETA Türkiye İzmir'de güzel bir etkinliğe imza atamıştı. O etkinlikte güzel bir de panel oturumumuz oldu. İtiraf etmek gerekirse epey eğlenceliydi. İşte o panelin video kaydı sonunda karşınızda! Panel kaydımızı FullHD hali ile INETA Türkiye YouTube kanalına kaydolup izleyebilirsiniz ;)

INETA İzmir Panel
INETA İzmir Panel

Videoyu izleyenlerden yorum bekliyorum :) Sevgiler...

Dün Yalova yolcusuyduk. INETA Türkiye yeni ekibi ile beraber (bu sefer ben bir konuşmacı olarak katıldım) :) ilk etkinliğimize gittik. "INETA üniversitenizde" serisinin ilk ayağı olan Yalova Üniversitesi etkinliğimiz her zamanki gibi benim için süper eğlenceli geçti.

Yalova Üniversitesi, HTML5 Oturumum
Yalova Üniversitesi, HTML5 Oturumum

Etkinlikte Windows 8, HTML5 ve ASP.NET 4.5 gibi konulara değindik. Sevgili Muammer Benzeş, Mahmut Temur ile beraber günübirlik bir yolculuk ile güzel bir etkinlik olduğunu ümit ediyorum :)

Etkinlikteki örneklerimizi de aşağıdaki linkten indirebilirsiniz. Kendinize çok iyi bakın!

Örnek Kodlar - HTML5.rar (12.59 MB)

İşte koca bir yıl daha geçti gidiyor :) Hepinize mutluluk, sevinç, huzur ve başarı dolu yepyeni bir yıl diliyorum! Herkesin kendine ve etrafına büyük faydalar sağladığı bir yıl dileklerimle...

Mutlu yıllar!

Nice yıllara....

HTML5 hikayelerinde her zaman en ön planda olanlar özelliklerden, konulardan biri audio ve video olur :) Eh HTML5 yeni birşey ve problemleri çözüyor vs diye düşünürken bilmem hiç denediniz mi ama tün HTML5 hikayesinde bir video veya audio tagını her tarayıcıda çalışır hale getirmek için yine her zamanki HTML/JavaScript taklalarını atmak gerekiyor :)

Son günlerde bu tarz bir proje üzerinde çalışırken keşfettiğim birkaç taklayı sizle paylaşmak istiyorum. Amacımız HTML5 ile tarayıcı içerisinde (tüm tarayıcılarda) ses dosyaları oynatmak. İlk olarak HTML5'deki audio tagının her tarayıcıda çalışmasını sağlamalı, sonrasında da HTML5 desteklemeyen tarayıcılar için Silverlight ile bir "kurtarma operasyonu" şansı tanımalıyız :)

W3C her şeye karışmıyor aslında...

W3C'ye baktığımızda HTML5 tagının tüm güncel tarayıcılarda desteklendiğini görüyoruz. Fakat W3C'nin ilgilenmediği bir nokta var :) O da bu taglerle oynatılabilecek ses dosyalarının formatı! Biraz daha konuyu karıştırdığımızda görüyoruz ki şu an piyasadaki tüm tarayıcılarda sadece MP3, Wav, ve Ogg desteği var. MP3'ü görünce kendinizi mutlu hissetmeye başlayabilirsiniz ama durun :) Firefox ve Opera MP3 desteklemiyor. Bu arada zaten WAV'ı listeden direk siliyorum :) PCM stream edecek değiliz. Firefox ve Opera ne destekliyor başka diye baktığımızda karşımıza OGG çıkıyor. Ama OGG'yi de Safari ve Internet Explorer desteklemiyor :) Yani özetle, herkesin desteklediği bir format yok. Ama eğer biz hem OGG hem MP3 sağlayabilirsek işte o zaman her yerde destek bulabiliriz.

Hem MP3 hem OGG lazım....

Çözümü bulduk. Eğer HTML5 ile her tarayıcıda bir ses dosyası oynatmak istiyorsak mecburen hem MP3 hem de OGG sağlamamız şart. Peki bunu nasıl yaparız?

[HTML]

<audio controls="controls">
   <source src="song.ogg" type="audio/ogg" />
   <source src="song.mp3" type="audio/mpeg" />
   Your browser does not support the audio element.
</audio> 

Yukarıdaki kod çok basit gözüküyor :) Sırası ile farklı codec'lerdeki dosyalarımızı ayrı ayrı source olarak audio kontrolüne veriyoruz ve işlem bitiyor. Her tarayıcı otomatik olarak kendi oynatabildiğini seçiyor. Şimdi gelelim başka bir soruna...

JavaScript ile source değişimi....

Benim uygulamam gereken senaryoda sayfada bir tane Audio tagı, yani bir player olacaktı. Sayfadaki bir başka playlistten hangi şarkıyı seçerseniz o oynatılacak audio tagında.. Hmmm demek ki source'u JavaScript ile değiştirmemiz lazım. İşte tam da bu noktada çoklu source verdiğinizde tarayıcıların bug'ları işin içine giriyor ve adam gibi bir çözüm bulmak neredeyse imkansız oluyor. Bir enumaration olarak Source listesini alıp değiştirebileceğinizi düşünürken hikayenin o şekilde çalışamadığını görüyorsunuz.

[JavaScript]

var source = document.createElement('source');
if (document.getElementById('videotag').canPlayType('audio/mpeg;')) {
    source.type = 'audio/mpeg';
    source.src = URL;
else {
    source.type = 'audio/ogg';
    source.src = OGG;
}

İşte yukarıdaki kod hayatınızı kurtarabilir :) Kod içerisinde yeni bir source tagi yaratıp, sonrasında sayfadaki adı videotag olan audio elementini bulup oynatabildiği codec'i de canPlayType metodu ile kontrol edip... yeni source'u video tagine aşağıdaki şekilde ekleyebiliyoruz.

[JavaScript]

document.getElementById('videotag').appendChild(source);
document.getElementById('videotag').play();

Sorun çözüldü :) Bu kod tüm tarayıcılarda çalışacaktır. Peki ya HTML5 yoksa? yani tarayıcı audio tagını hiç desteklemiyorsa? İşte o zaman sayfaya bir Silverlight player koyacağız. İster hazır bir Silverlight player bulun ister kendiniz yazın önemli olan o Silverlight Player'ı sayfaya JavaScript ile koyabilmeniz ve benim senaryomda yine JavaScript ile SL Player'a hem oynatacağı dosyanın yolunu hem de gerekli play/stop komutlarını gönderebilmek.

Not: Silverlight içerisinde nesne ve Play/Stop gibi metodları, işlemleri JavaScript'e açabilmek için "Silverlight 2.0 ve JavaScript Kardeşliği" makalesine göz atabilirsiniz.

İlk olarak sayfamız açıldığında tarayıcının HTML5'in audio tagini destekleyip desteklemediğini bulmamız gerek. Bunun için basit bir şekilde, daha önceki adımlarda kullandığımız canPlayType metodunun var olup olmadığını kontrol edebiliriz.

[JavaScript]

if (!document.createElement('audio').canPlayType) 

Eğer canPlayType yoksa belli ki HTML5 desteği yok ve artık Silverlight kontrolünü sahneye koymanın zamanı geldi. Yeni bir SL nesnesi yaratıp, onu bir XAP ile ilişkilendirip sahneye koymak için Silverlight.js dosyası içerisindeki createObject metodunu kullanacağız. Bahsettiğimiz Silverlight.js zaten her Silverlight projesi ile beraber gelir ve Silverlight SDK içerisinde de bulunur. Bu dosyayı sayfaya include ettikten sonra aşağıdaki şekilde SL objemizi yaratabiliriz.

[JavaScript]

var getSilverlightMethodCall =
"javascript:Silverlight.getSilverlight(\"4.0.60310.0\");"
var installImageUrl =
"http://go.microsoft.com/fwlink/?LinkId=161376";
var imageAltText = "Get Microsoft Silverlight";
var altHtml =
"<a href='{1}' style='text-decoration: none;'>" +
"<img src='{2}' alt='{3}' " +
"style='border-style: none'/></a>";
altHtml = altHtml.replace('{1}', getSilverlightMethodCall);
altHtml = altHtml.replace('{2}', installImageUrl);
altHtml = altHtml.replace('{3}', imageAltText);

Silverlight.createObject(
"ClientBin/sl_player.xap",
slhost, "slPlugin",
{
    width: "100%", height: "100%",
    background: "white", alt: altHtml,
    version: "4.0.60310.0"
},
{ onError: onSLError, onLoad: onSLLoad },
"param1=value1,param2=value2,param3=varsa init
paramlar
buradan gönderilebilir"
"row3");

Yukarıdaki kodu ben de Silverlight SDK'in içinden çaldım :) Burada dikkat edilmesi gereken birkaç nokta var. Birincisi slhost adındaki parametre Silverlight objesinin yerleştirileceği sayfadaki host elementi. Yani aşağıdaki gibi bir DIV.

[HTML]

<div id="slhost">
</div>

Böyle bir DIV'i sayfada istediğiniz yere koyarsanız. Bir üstteki JavaScript kodu çalıştığında SL projeniz bu DIV içerisine yerleştirilecektir. JavaScript kodundaki parametrelerden biri tabi ki XAP dosyasının yolu. Onu zaten ayarlarsınız uygun şekilde. Bir diğer parametre ise bende "slPlugin" olarak atanmış olan sayfa içerisinde SL objenizin adı. Bu isim, SL objesinin document.getElementById('slPlugin') şeklinde ulaşmak istediğinizde kullanacağınız nesne adını belirliyor. Daha önce de dediğim gibi JavaScript ile bu SL player'a dosya yolu göndermemiz ve o dosyayı oynatması için komut vermemiz gerekecek. O nedenle JavaScript'ten bu SL objesine ulaşabilmemiz çok kritik.

JavaScript kodundaki diğer parametreler sanırım anlaşılır durumdalar. Yükseklik, genişlik vs açıklamaya gerek yok. Son bir nokta ise alt parametresi ile ilgili. Bu parametreye vereceğiniz HTML eğer ki sistemde SL Runtime yüklü değil ise yine bizim slhost DIV'i içerisine konacak olan HTML. Örnekteki kodu ben SDK'den aldığımız için standard "Get Microsoft Silverlight" yazısı gelecektir. İsterseniz JavaScript'teki HTML'yi değiştirebilirsiniz.

Silverlight ve JavaScript

Bu konuda özellikle "Silverlight 2.0 ve JavaScript Kardeşliği" makalemi okumanızı tavsiye ederim. Detaylara girmeden ben özellikle bu projede ne yaptığımdan bahsedeceğim.

Silverlight projesinde ekrana bir MediaElement atıp aşağıdaki şekilde de ufak bir Play metodu yazıp bunu ScriptableMember olarak tanımlıyoruz.

[C#]

[System.Windows.Browser.ScriptableMember()]
public void Play(string URL)
{
    myMedia.Source = new Uri(URL, UriKind.Absolute);
    myMedia.Play();
}

Metod malum URL'i parametre olarak alıp myMedia adındaki MediaElemente atıp oynatıyor. Ayrıca App Start'ta tüm SL projesini aşağıdaki şekilde ScritableObject olarak tanımlayıp adını da "Page" veriyoruz.

[C#]

var Root = new MainPage();
System.Windows.Browser.HtmlPage.RegisterScriptableObject("Page", Root);
this.RootVisual = Root;

Son olarak artık JavaScript'ten dosya yolunu verip C#'daki Play metodunu çağırabiliyoruz.

[JavaScript]

document.getElementById('slPlugin').Content.Page.Play('URLBURADA');

Gördüğünüz üzere basit bir audio player işi tahmin ettiğinizden daha karışık hale gelebiliyor. Özetle dikkat etilmesi gereken birkaç nokta var;

  • MP3 ve OGG tüm tarayıcılar için şart.
  • canPlayType ile codec kontrolü yapılabilir.
  • HTML5 desteği yoksa SL veya Flash player şart.
  • SL dosyasını JavaScript'ten sayfaya alıp kontrol edebiliriz.

Hepinize kolay gelsin! ;)

Her yılbaşı bir anlamda yeni bir başlangıca vesile olma potansiyeli taşır :) İşte bu yılbaşında bu potansiyeli kinetiğe çevirip :) INETA tarafında iki bayrak değişikliği yapıyoruz. Bunlardan ilki INETA Türkiye Başkanlığı ile ilgili.

Yeni INETA Türkiye Lideri : Muammer Benzeş

Muammer yaklaşık iki yıldır INETA Türkiye yönetim ekibinde Başkan Yardımcılığı yaparken gönüllü çalışmalarımıza muhteşem katkısı ile her zaman arkamda oldu. Desteğini yadsımam mümkün bile olamaz. Gönüllü olarak hayatından ayırdığı zaman ve emeği emin olun ölçmek çok zor. Özünde 100% bir yazılımcı olmasa da :) uzmanlık alanı ITPro tarafı olsa da Muammer'in INETA Türkiye faaliyetlerinde çılgın katkısı var. Önümüzdeki dönemde INETA Türkiye Başkanlığı bayrağını Muammer Benzeş'e devrediyorum. Yılbaşı gecesi yapacağımız geri sayım sonrası :) 1 Ocak 2012'de Muammer INETA Türkiye Başkanlığı görevine başlayacak. Kendisini buradan hem kutluyorum hem de efsane işler çıkması için azim ve biraz da şans diliyorum ;)

Bu arada INETA Türkiye yeni yönetim ekibine de yeni yılda başarılar ;)

INETA MEA'daki değişiklikler...

2008 Mart ayında INETA Türkiye Başkanlığı görevini almışım. Aradan üç dört yıla yakın süre geçmiş. Bu sürede neler neler yaptık :) 2009'da INETA MEA yönetim ekibinde "Speaker Bureau Lead" görevini de üstlendim ve Türkiye ile beraber MEA'daki görevime de devam ettim. Artık yeni bir değişikliğin zamanı gelmişti :) Ben de 1 Ocak 2012 tarihi itibari ile INETA MEA Başkanı olarak INETA'daki macerama devam edeceğim. Benden önce görevi üstlenen sevgili Özgür Seyrek'e buradan tüm çalışmaları için teşekkür ediyorum.

INETA Logo

INETA MEA Yönetim Ekibi önümüzdeki dönemde çok daha büyüyecek ve toplu bir tekrar organizasyon dönemine gireceğiz. Bu çerçevede bazılarınız eminim ki "Ne yani artık Türkiye ile ilgilenmeyecek misiniz?" gibi bir soru soracaktır :) Tabi ki böyle birşey yok. Sonuç itibari ile Türkiye de MEA dediğimiz bölgenin içerisinde ve daha da önemlisi yaşadığım ülke, anadilimin konuşulduğu ülke vs vs :) O nedenle böyle birşey söz konusu bile olamaz. Ama tabi ki bugünden sonra INETA Türkiye Başkanı olarak iletişim noktanız Muammer Benzeş olacaktır.

Tüm bu değişikliklerin hepimize, herkese hayırlı olmasını diliyorum. Tamamen gönüllülük üzerine oturmuş bir organizasyon olarak INETA'nın bölgemizde bir adım daha ileri gidebilmesi için herşeyin gerçekleştiği yeni bir yıl diliyorum ;)

Bu vesile ile :) hepinizi öpüyorum!

HTML5 ile beraber gelen yenilikler arasında en pratiklerinden bir tanesi input type sayısının günümüz ihtiyaçlarına göre arttırılıyor olması. email, url, number, range, date picker, search ve color adlarında yeni input typelarımıza hoş geldiniz diyebilirsiniz :)

[HTML]

        <input name="TextBox1" type="email" id="TextBox1" />

Yukarıda gördüğünüz input kontrolünün tipi aynen tahmin edeceğiniz üzere bu kontrolün içerisine bir e-mail adresi yazılacağını belirtiyor. Bu şekilde yapılan bir ayarlama bizi doğrudan istemci taraflı validasyon kodu yazmaktan da kurtarıyor ve tarayıcı kendisi bu gibi validasyonları çözebiliyor.

HTML5 E-Mail Adresi Kontrolü
HTML5 E-Mail Adresi Kontrolü

Eğer isterseniz gösterilecek olan uyarı yazısını ve hatta özel durumlarda validasyon için kullanılacak RegEx Pattern'i de ayrıca belirleyebilirsiniz.

[HTML]

        <input type="tel" name="tel" 
            pattern
="\(\d\d\d\) \d\d\d\\d\d\d\d" 
            title
="Telefon numarasını (212) 2223344 şeklinde yazınız." />

Yukarıdaki kod içerisinde hem pattern hem title özellikleri gerekli özelleştirmemeleri yapabilmemizi sağlıyor. Gelin hızlıca birkaç örneğin daha kodunu inceleyelim.

[HTML]

    <label>
        Enter your first name:
        <input name="firstname" type="text" required>
    </label>
    <input type="url" name="url" />
    <input type="email" name="email" />
    <input type="number" min="0" max="10" step="2" />

Kodumuzdaki yeniliklerden biri "required" attribute'ü. Bu attribute sayesinde bir hücrenin kesinlikle doldurulup doldurulmaması gerektiğine dair bilgiyi verebiliyorsunuz. Input Type Number olan kontrol ise sıfır ile on arasında ikinin katlarından biri olarak bir sayı istenmesini sağlıyor.

Eğer bu kontrollerle ilgili invalid durumundaki görselliği değiştirmek isterseniz aşağıdaki gibi bir CSS kodu yazmak mümkün.

[CSS]

    <style type="text/css">
        input:invalid
        {
            bordersolid red;
            font-weightbold;
        }
    </style>

Tüm bunlarla ilgili ASP.NET 4.5 ile beraber gerekli düzenlemeleri ASP.NET tarafında da göreceğiz.

ASP.NET 4.5'ten yeni HTML5 Input Type'lara destek.
ASP.NET 4.5'ten yeni HTML5 Input Type'lara destek

Ekran görüntüsünden de görebileceğiniz üzere ASP.NET'teki basit bir Textbox'ın artık çok daha fazla TextMode'u var. Tüm bu TextMode'lar HTML5'teki yeni Input Type'lara denk geliyor ve uygun HTML5 kodunun yaratılmasını sağlıyor.

Gelecek çok güzel olacak :) Hepinize kolay gelsin.