Asp.Net ile Twitter’ a gönderi yapmak

FriendFeed başlığıyla aynı olsun istedim :) son yılların en anlamsız aynı zamanda da en anlamlı girişimi hiç şüphesiz Twitter. Herkes adını duymuştur herkes üyedir ama kimse ne işe yaradığını bilmez, ne işe yaradığını bilenler fuzuli bir araç olduğunu söyler ama ne var ki herkesde aynı zamanda bu hizmeti kullanır. Burada durum Twitter nedir ne değildir diye uzun uzadıya birşey yazmayacağı, amacım belli asp.net ile Twitter’ a gönderi yapacağız, yani twitliyeceğiz :) FriendFeed örneğinde thread kullanmamıştık, bu örnekte thread kullanmakta fayda var diye düşünüyorum. Nedeni ise Twitter FriendFeed e göre çok daha etkin kullanılan bir hizmet olduğundan zaman zaman sunucuları bize geç cevap verebiliyor, bazen hiç cevap veremiyor Twitter’ ın deyimiyle over capacity oluyor. Bu arada thread nedir diye soracak olursanız buraya bakmanızı öneririm. Kaba tabirle ne olduğunu anlatmaya çalışayım. Methodumuzu aynen yazıyoruz, fakat methodu yeni bir thread ile çağıyorsunuz. Twitter örneğinde kullanıcı sayfanın işlemi yapmasını bekler, çünkü ilk önce bağlantı kurulup sonrasında bilginin karşıya gönderilmesi gerekmektedir, bu da karşı tarafın ve sizin trafiğinize göre değişkenlik gösterir. Kimi zaman 2 saniyede gerçekleşen iş kimi zaman 20 saniyede gerçekleşir. Thread ile bu işi arkaplanda yaptırıyoruz. Yani kullanıcıyı hiç bekletmiyoruz. Kullanıcı direk işlemin tamamlandığını görüyor, fakat arkatarafta thread işlemi koşturup sonuçlanmasını sağlıyor. Unutmadan projemize referans olarak Microsoft.Http.dll’ yi ekliyoruz. Twitter a gönderi yapmak için api anahtarına ihtiyaç duymuyoruz. Direk kullanıcı adımız ve şifremiz yeterli oluyor. Bu arada gönderiyi yapan kodu bir yerden bulmuştum fakat adresi hatırlamadığımdan kaynak gösteremiyorum. Yazan arkadaş hakkını helal etsin :) Okumaya devam et Asp.Net ile Twitter’ a gönderi yapmak

Asp.Net Ajax Upload

Sağım solum önüm arkam AJAX ! Ajax ile dosya yüklemek işgence olmaktan çıkıyor desem sanırım abartmış olmam. Sayfa yeniden yüklenmediğinden dolayı kullanıcı seçtiği dosyayı sistemize yüklerken öte yandan formun geri kalanını rahatlıkla doldurabiliyor. jQuery nin Ajax Upload eklentisiyle iki dakika da upload işimizi halledebiliyoruz. Bu adreste klentinin demoları bulunuyor. Bu arada ben güvenlik sebebiyle örneğimde sadece .jpg dosyalarını yükletiyorum. Okumaya devam et Asp.Net Ajax Upload

jQuery ile FaceBook tarzı fotoğraf etiketleme

Facebook’ un fotoğrafları etiketleme (tag) lama mekanızmasını bilmeyen yoktur herhalde. Geçen gün lazım oldu ara tara bir türlü istediğim gibisini bulamadım. İsteğimize en yakın olan olan scripti gözüme kestirip facebook vari bir etiketleme mekanızması yapmaya çalıştım. (Scriptin (betik) orjinal halini bir türlü bulamadım, unutmazsam yarın eklerim.) Betiğe eklediğim özellikler; etiketleme sırasında arkadaşların listesi geliyor ve tıklayıp o kişiyi etiketleyebiliyorsunuz. Arkadaş listenizde arama yapabiliyorsunuz. Etiketleme işlemlerini veritbanına yazma ve okuma. Ufak tefek bir kaç ayar daha verdim. Betik kullanılacağı yere göre kolayca düzenlebilir. Bundan dolayı bir kullanıcı etiketlenmişse tekrar etiketlenemesin veya benzeri durumlar için hiç bir işlem yapmadım, heh unutmadan sql enjeksiyona önleminizi almadan direk kullanmayın. İsteyen istediği gibi düzenleyip kullanabilir, zaten görünce ne kadar basit bir şey olduğunu göreceksiniz.

jquery facebook style etiket tag Okumaya devam et jQuery ile FaceBook tarzı fotoğraf etiketleme

Asp.Net ile FriendFeed’ e gönderi yapmak.

Son günlerde o api senin bu api benim uğraşıp duruyor, kim mi ? Tabi ki Emre abi :) Twitter’ a göre çok bilindik olmasada FriendFeed’ de azımsanmıyacak bir kullanıcı kitlesine sahip. Basit bir şekilde FF hesabınıza nasıl gönderi yapabileceğimizi göreceğiz. İlk önce api keyinizi  https://friendfeed.com/account/api adresinden öğrenip, projemize referans olarak Microsoft.Http.dll‘ yi ekliyoruz. Okumaya devam et Asp.Net ile FriendFeed’ e gönderi yapmak.

String i Hex e, Hex i String e dönüştürme.

Ne garip bir başlık oldu yav :) String to Hex, Hex to String yazacaktım sonra
dedim güzel Türkçe' mi kullanayım. Geçenlerde başımız bir session nesnesi
yüzünden okadar ağırdıki tarifi inanın mümkün değil. İlgili kodları şekilden
şekile soktuk, amuda bile kaldırdık ama bir türlü çözüm bulamadık. En sonunda
session daki veriyi bir anahtarla birlikte şifreleyip adres çubuğundan taşıyalım
dedik. Nitekimde başarılı olduk ama zaman zaman sıkıntılar olduğunu gözledik.
Arkadaş zaten canımızı çıkaran bir durumdu tam hallettik derken yine hata almak
ciddi şekilde canımızı sıktı. Sıkıntı şifrelenen verinin + ^ | gibi
karakterlerin adres çubuğundan taşınırken problem çıkarmasından ileri
geliyormuş. HtmlDecode ve benzeri aksiyonların işe yaramadığı bir durum.
Emre abi
nin imda da yetiştiği bu durumda, karşı tarafa şifrelenmiş veriyi Hex formatına
dönüştürüp adres çubuğundan taşıyıp, sonrasında Hex veriyi stringe dönüştürerek
başarılı bir şekilde taşımış olduk. Böylelikle ciddi bir tecrübe edinmiş olduk,
demekki karmaşık karakterli verileri işlemler sonunda Hex formatında taşımak
gayet sağlıklı oluyormuş. Bu durumda dönüşümler kullandığımız kodları sizlerle
paylaşmak istedim.

    public string ConvertStringToHex(string asciiString)
    {
        string hex = "";
        foreach (char c in asciiString)
        {
            int tmp = c;
            hex += String.Format("{0:x2}", (uint)System.Convert.ToUInt32(tmp.ToString()));
        }
        return hex;
    }

    public string ConvertHexToString(string HexValue)
    {
        string StrValue = "";
        while (HexValue.Length > 0)
        {
            StrValue += System.Convert.ToChar(System.Convert.ToUInt32(HexValue.Substring(0, 2), 16)).ToString();
            HexValue = HexValue.Substring(2, HexValue.Length - 2);
        }
        return StrValue;
    }

TimeSpan ile şu kadar saniye, dakika, saat ve gün olayı

TimeSpan iki zaman arasındaki farkı bize veren bir fonksiyon. Kullanımıda
gerçekten çok basit. İşlemin sonunda bize milisaniye, saniye, dakika, saat ve gün değerlerini double tipinde geri döndürüyor.
Facebook, friendfeed veya twitter gibi sitelerde, bu içerik bir kaç saniye önce
eklendi yada 5 saat önce yüklendi gibi mesajları görmüşsünüzdür, TimeSpan
kullanarak bu işlemin nasıl yapıldığına bir göz atalım.

protected void Page_Load(object sender, EventArgs e)
{
    DateTime hesaplanacakZaman = new DateTime(2010, 05, 15, 21, 23, 00);
    Response.Write(neZaman(hesaplanacakZaman));
}

public string neZaman(DateTime d) {
    TimeSpan tS = DateTime.Now-d;
    int dakika = (int)tS.TotalMinutes;
    int saat = (int)tS.TotalHours;
    int gun = (int)tS.TotalDays;
    string strTemp;
    if (dakika < 1)
    {
        strTemp = "bir kaç saniye önce";
    }
    else if (dakika < 60)
    {
        strTemp = dakika+" dakika önce";
    }
    else if (saat < 24)
    {
        strTemp = saat+" saat önce";
    }
    else
    {
        strTemp = gun+" gün önce";
    }
    return strTemp;
}

Gördünüz gibi gayet basit ve anlaşılır bir yöntem. Sonraki yazıda görüşmek üzere hoşçakalın..

GridView XML Veri Listeleme, Ekleme, Düzenleme ve Silme İşlemleri

Asp.Net ile ilgili epeydir yazı yazmıyordum, kısmet bugüneymiş. Başlıktan da anlaşılacağı üzere gridview kontrolü ile xml bir veriyi nasıl listeleyebilir, düzenleyebilir, silebilir ve yeni bir kayıt ekleyebileceğimize bakacağız. Bunun yanında gridview nesnesini css ile kolayca nasıl biçimlendirebildiğimizide göreceğiz. Lafı daha fazla uzatmadan konumuza dönelim. Aşşağıda xml verimizi görüyoruz.

    <?xml version="1.0" encoding="utf-8"?>
    <urunler>
      <urun>
        <kod>001</kod>
        <ad>Cep telefonu7</ad>
        <fiyat>1145</fiyat>
        <parabirimi>$</parabirimi>
      </urun>
      <urun>
        <kod>002</kod>
        <ad>Fotoğraf makinası</ad>
        <fiyat>250</fiyat>
        <parabirimi>TL</parabirimi>
      </urun>
    </urunler>

İlk önce projemize yeni bir gridview kontrolü ekleyip, onrowcancelingeditonrowdeleting, onrowediting, onrowupdating olaylarını(event) etkinleştiriyoruz. Sonrasında AutoGenerateColumns özelliğinide false olarak ayarlıyoruz. Bunun nedeni sütunları biz elle oluşturacağız, eğer sütunları direk almak istersek bu özellik true olarak kalabilir.
Birde unutmadan CssClass olarak da gridView değerini veriyoruz. Bunu gridview imizi biçimlendirirken kullanacağız. Bir sonraki adımımız xml verimizden gelecek olan veri alanlarını ve biçimlendirme için gerekli olan diğer tanımlamaları yapmak. Aşşağıda bu saydığım olayların yapılmış halini görebilirsiniz. Unutmadan birde yeni veri girişi için gerekli olan formumuz bulunuyor.

    <asp:GridView runat="server" ID="gvListe" CssClass="gridView"
        onrowcancelingedit="gvListe_RowCancelingEdit"
        onrowdeleting="gvListe_RowDeleting" onrowediting="gvListe_RowEditing"
        onrowupdating="gvListe_RowUpdating" AutoGenerateColumns="False">

        <HeaderStyle CssClass="baslik" />
        <RowStyle CssClass="satir" />
        <AlternatingRowStyle CssClass="aSatir"/>

        <Columns>
            <asp:TemplateField HeaderText="Kod">
                <EditItemTemplate>
                    <asp:TextBox ID="txtKod" runat="server" Text='<%# Bind("kod") %>'></asp:TextBox>
                </EditItemTemplate>
                <ItemTemplate>
                    <asp:Label ID="lblKod" runat="server" Text='<%# Bind("kod") %>'></asp:Label>
                </ItemTemplate>
            </asp:TemplateField>
            <asp:TemplateField HeaderText="Ad">
                <EditItemTemplate>
                    <asp:TextBox ID="txtAd" runat="server" Text='<%# Bind("ad") %>'></asp:TextBox>
                </EditItemTemplate>
                <ItemTemplate>
                    <asp:Label ID="lblAd" runat="server" Text='<%# Bind("ad") %>'></asp:Label>
                </ItemTemplate>
            </asp:TemplateField>
            <asp:TemplateField HeaderText="Fiyat">
                <EditItemTemplate>
                    <asp:TextBox ID="txtFiyat" runat="server" Text='<%# Bind("fiyat") %>'></asp:TextBox>
                </EditItemTemplate>
                <ItemTemplate>
                    <asp:Label ID="lblFiyat" runat="server" Text='<%# Bind("fiyat") %>'></asp:Label>
                </ItemTemplate>
            </asp:TemplateField>
            <asp:TemplateField HeaderText="Para Birimi">
                <EditItemTemplate>
                    <asp:TextBox ID="txtParaBirimi" runat="server" Text='<%# Bind("parabirimi") %>'></asp:TextBox>
                </EditItemTemplate>
                <ItemTemplate>
                    <asp:Label ID="lblParaBirimi" runat="server" Text='<%# Bind("parabirimi") %>'></asp:Label>
                </ItemTemplate>
            </asp:TemplateField>
            <asp:CommandField ShowEditButton="True" ShowDeleteButton="true" />
        </Columns>
    </asp:GridView>

    <div class="form">
        <h1>Yeni kayıt ekle !</h1>
        <span>Kod</span><asp:TextBox runat="server" ID="txtKod" />
        <span>Ad</span><asp:TextBox runat="server" ID="txtAd" />
        <span>Fiyat</span><asp:TextBox runat="server" ID="txtFiyat" />
        <span>Para Birimi</span><asp:TextBox runat="server" ID="txtParaBirimi" />

        <asp:Button runat="server" ID="btnEkle" Text="Ekle !" onclick="btnEkle_Click" />
    </div>

Geliyoruz ikinci aşamamıza nedir bu aşamalar ? Xml verisinin listelenmesi, düzenlenmesi ve silinmesi. Bu işlemler için gerekli olan kodlarımıza bakıyoruz.

public partial class _Default : System.Web.UI.Page
{
string strVeriYol;
XmlDocument xdDoc = new XmlDocument();
protected void Page_Load(object sender, EventArgs e)
{
strVeriYol = Server.MapPath("~/veri.xml");
if (!IsPostBack)
{
gvDoldur();
}
}

protected void gvDoldur() {
DataSet ds = new DataSet();
ds.ReadXml(strVeriYol);
gvListe.DataSource = ds.Tables[0];
gvListe.DataBind();
}

protected void gvListe_RowDeleting(object sender, GridViewDeleteEventArgs e)
{
string strKod = ((Label)gvListe.Rows[e.RowIndex].Cells[0].FindControl("lblKod")).Text;
xdDoc.Load(strVeriYol);
XmlNode xnDuzenle = xdDoc.SelectSingleNode("/urunler/urun[kod='" + strKod + "']");
xnDuzenle.ParentNode.RemoveChild(xnDuzenle);
xdDoc.Save(strVeriYol);
gvListe.EditIndex = -1;
gvDoldur();
}
protected void gvListe_RowEditing(object sender, GridViewEditEventArgs e)
{
gvListe.EditIndex = e.NewEditIndex;
gvDoldur();
}
protected void gvListe_RowCancelingEdit(object sender, GridViewCancelEditEventArgs e)
{
gvListe.EditIndex = -1;
gvDoldur();
}
protected void gvListe_RowUpdating(object sender, GridViewUpdateEventArgs e)
{
string strKod = ((TextBox)gvListe.Rows[e.RowIndex].Cells[0].FindControl("txtKod")).Text;
string strAd = ((TextBox)gvListe.Rows[e.RowIndex].Cells[1].FindControl("txtAd")).Text;
string strFiyat = ((TextBox)gvListe.Rows[e.RowIndex].Cells[2].FindControl("txtFiyat")).Text;
string strParaBirimi = ((TextBox)gvListe.Rows[e.RowIndex].Cells[3].FindControl("txtParaBirimi")).Text;

xdDoc.Load(strVeriYol);
XmlNode xnDuzenle = xdDoc.SelectSingleNode("/urunler/urun[kod='"+strKod+"']");
if (xnDuzenle != null)
{
xnDuzenle["kod"].InnerText = strKod;
xnDuzenle["ad"].InnerText = strAd;
xnDuzenle["fiyat"].InnerText = strFiyat;
xnDuzenle["parabirimi"].InnerText = strParaBirimi;
xdDoc.Save(strVeriYol);
}
gvListe.EditIndex = -1;
gvDoldur();
}
protected void btnEkle_Click(object sender, EventArgs e)
{
xdDoc.Load(strVeriYol);
XmlElement xeYeni = xdDoc.CreateElement("urun");
xeYeni.InnerXml = "" + txtKod.Text + "" + txtAd.Text + "" + txtFiyat.Text + " " + txtParaBirimi.Text + "";
xdDoc.DocumentElement.AppendChild(xeYeni);
xdDoc.Save(strVeriYol);
Response.Redirect("default.aspx");
}
}

Üçüncü aşamamızda gridview imizi biçimlendirmek için gerekli olan css kodlarımız bulunuyor. Burada ilk önce table elementini sıfırlıyoruz. Daha sonra
gridview nesnemizin içinde tanımlamış olduğumuz, HeaderStyle, RowStyle ve AlternatingRowStyle özelliklerini biçimlendiriyoruz. Burada size tavsiyem
sayfanızın yorumlanmış halinin kaynak kodlarına bakmanızdır.
İlgili kodları buradan indirebilirsiniz.
Evet arkadaşlar geldik bir yazının daha sonuna, umarım faydalı olmuştur. Herkese çalışmalarında başarılar.

Asp.Net projelerimizde neden jQuery kullanmalıyız ?

Bilmeyenler için jQuery bir javascript çatısıdır. (framework). Bilidiğiniz üzere web ortamında kullanıcı tarafında yapmamız gereken aksiyonları javascript ile yapabiliyoruz. Web 2.0 ile birlikte kullanıcı tarafındaki özellikler bir hayli arttı ve önem kazandı. Bu olayın şüphesiz öncüleri Facebook ve Google gibi isimler oldu. Hayatımıza giren yeni özelleklerden bazıları şu şekilde; sayfa yeniden yüklenmeden sunucu taraflı işlemler yapabilme (ajax), sekme (tab), aramalarda otomatik tamamlama (auto complete) gibi.. Asp.Net geliştiricilerinin bildiği üzere Ajax Control Kit ile yukarda bahsettiğim işleri çok basit bir şekilde projelerimize uygulayabiliyoruz. Böyle bir imkan varken neden jQuery kullanalım dimi ? Bunun bir çok sebebi bulunuyor, isterseniz bunlara bir göz atalım.

jquery logo

  1. Esneklik: Ajax control kit ile kalıpların az dışına taşmaya kalktığınızda önümüze öyle engeller çıkarki takla üzerine takla atmak zorunda kalırız. jQuery ile bir satırlık kod ile yapacağınız şeyi satırlarca kod yazarak ancak çözeriz, çoğu zaman çözemeyiz bile.
  2. Diğer scriptlerle olan çakışmalar: Projeniz bitmek üzeridir ve sizden istenen son bir özelliğin daha eklenmesi istenir. İnterneti didik didik ararsınız ve bu iş için mükemmel bir script bulursunuz. Scripti projenizde çalıştırmaya kalkarsınız fakat bir türlü çalışmaz çünkü control kit ile çakışmıştır. Durupda pirincin taşını ayıklamak çok uzun zaman alır hatta çoğu zaman taşı ayıklayamazsınız bile :) Burda şunu söyleyebilirsiniz, jQuery kullanılan bir sayfaya farklı bir script eklemeye çalıştığımızda da bu durumun olması olasıdır. Evet doğru fakat bu durum ajax control kit kadar sık karşılaşılan bir durum değildir. Ayrıca jQuery kullanıyorsanız sayfanıza çoğu zaman ekstradan bir script ekleme ihtiyacı duymazsınız, ya kendiniz yazarsınız yada yüzlerce eklentiden bir tanesini alır direk kullanır yada isteğinize göre düzenleyebilirsiniz.
  3. Performans: Siz kullanmasanız bile en basit işler için bile ajax control kit arka planda öyle şeyleri sayfanıza yüklerki performans bu durumdan ciddi anlamda etkilenir. Hatta çoğumuzun başına tarayıcının kitlenmesi gibi durumlar gelmiştir. jQuery ile herşeyin kontrolü bizdedir, biz ne yazarsak o olur, bu yüzden çok daha verimli çalışır.
  4. Tarayıcı uyumluluğu: Bu web tasarımı ile uğraşan herkesin ortak sıkıntısıdır, zaten tasarımı taracıya uydurmak için çeşitli taklalar atıyoruz birde bunun içine ajax control kit girince işkence kaçınılmaz oluyor. Çoğu zamanda elleriniz kollarınız bağlı hiç bir şey yapamıyorsunuz. jQuery tarafında ise böyle bir derdiniz yok bir kere yazın heryerde çalışsın, mobil cihaz tarayıcılarında bile..
  5. Kontrol edilebilirlilik: Eğer yapılan iş sizin kontrolünüz dışındaysa koda, ekleme, çıkarma veya düzenleme gibi işlemler çok zordur. Yeni açtığınız projenize jquery.js yi ekledikten sonra dışarıdan hiç bir scripte gerek kalmadan projenizi sonlandırabilirsiniz. Kodunu yazamayacağınız şeyler içinse jquery eklentilerini gönül rahatlığıyla kullanabilirsiniz.

jQuery dünyasına ilk adımı atmak biraz zor gelebilir fakat içine girdiğinizde kullanması ve kodlanması oldukça kolay bir çatı olduğunu göreceksiniz. Yaptığınız işten bir okadar daha zevk alacağınızın garantisinide ben veriyorum. Şimdilik benden bu kadar ilerleyen günlerde tekrar görüşmek üzere, hoşçakalın..

Asp.Net ile jQuery Autocomplete kullanmak

Bilmeyenler için autocomplete nedir onu söyleyeyim, bir textbox’ a kelime girmeye başlıyorsunuz ve o ana kadar girilmiş olan karakterleri veritabanında arayıp alt tarafta açılan listede, ilgili kayıtları kullanıcıya sunan bir sistem. Google buna güzel bir örnek teşkil ediyor. Bu işlem için Ajax Control Toolkit içinde bulunan AutoComplete nesnesiyle de işimizi görebiliyoruz. Fakat ajax control araçlarıyla projemize bir şey eklediğimizde arka planda bir kod ve dosyada beraberinde projemize eklenmiş oluyor, bu durum büyük projelerde problemler çıkartabilir. Hemde zaman zaman tarayıcıdan tarayıcıya antin kuntin problemleride beraberinde getiriyor. Aklıma gelmişken, oldukçada yavaş çalışıyor. Kısacası kullanması basit fakat performansı çok kötü bir yöntem. Uzun zamandır projelerimde jQuery kullanıyorum ve en ufak bir problem dahi yaşamadım. Master sayfama jQuery’ i ekliyorum ve tüm projede istediğim herşeyi rahatlıkla yapabiliyorum. Farklı durumlar içinse bir sürü eklentisi bulunuyor. AutoComplete‘ de bunlardan biri. Eklentinin sayfasına buradan ulaşabilir, demosuna buradan bakabilirsiniz. Anlatacağım örnekte direk veritabanından arama yapacağız. Daha fazla uzatmadan kodlarımıza bakalım. İlk önce gerekli dosyaları indirip, projemize ekliyoruz.

http://jquery.bassistance.de/autocomplete/lib/jquery.js
http://jquery.bassistance.de/autocomplete/jquery.autocomplete.js

http://jquery.bassistance.de/autocomplete/jquery.autocomplete.css

Sonrasında aşşağıdaki gibi kodumuzu yazıyoruz.

Default.aspx sayfamız

	<script type="text/javascript">
    $(document).ready(function() {
        $("input#<%=txtKelime.ClientID %>").autocomplete('Ara.aspx').result(function(event, item) {
            $("#<%=txtGizliAlan.ClientID %>").val(item.toString().split(",")[1]);
        });
	});
	</script>

	<form runat="server" id="form1">
		<asp:textbox id="txtKelime" runat="server" />
		<asp:textbox id="txtGizliAlan" runat="server" style="display:none" />
	</form>

Yukarıdaki kodda txtGizliAlan olarak gördüğümüz alan, seçtiğimiz kaydın id değerinin saklandığı alanımız. Yani ilgili kaydın id sini veritabanına yazacaksak burayı kullanıyoruz.

Ara.aspx sayfamız

protected void page_load(object sender, EventArgs e) {
string strKelime = Request.QueryString["q"];// burada gelen değeri sql enjeksiyondan korunmak için kontrol etmeyi unutmayın !
DataTable dt = veritabani.DataTableGetir("Select * from tabloAdi where aranacakAlan like '%" + strKelime + "%'");
foreach (DataRow dr in dt.Rows)
{
Response.Write(dr["alanAdi"].ToString() + "|" + dr["id"].ToString() + Environment.NewLine);
}
}

İşte bu kadar kolay ! Artık bizimde bir Autocomplete mekanızmamız var.

MVC ve Ado.Net Entity’ e Merhaba

Klasik Asp’ den kurtulup Asp.Net’ e geçtiğim günü daha dün gibi hatırlasamda aradan 1 sene belkide daha çok zaman geçti. Hayatım boyunca yeniliklere hep geç adapte oldum, yakın zamana kadar Front Page 2003 kullanıyordum zorda olsa ondanda kurtuldum. Şimdilerde yeni yeniliklere yelken açma zamanın geldiğinin resmidir. Bu yazdıklarımın konumuzla ne alakası var açıkcası bende bilmiyorum ama girişler hep zor oluyor :D

Emre Tekelioğlu (yazının içinde Emre abi şeklinde bahsedeceğim) ile Trabzon Spor ile ilgili projelerde çalışmıştık ve muhabbetimizde süperdi. Şimdi Emre abiyle aynı ofisi paylaşıyoruz. Bizim tabirimizle yan yana yardırıyoruz. Elizde varolan projelere başlamadan önce neler yapabiliriz ve nasıl yapabilirizi uzun uzun konuştuk tartıştık. Özellikle veritabanıyla olan işlerimizi en iyi şekilde nasıl hallederizi aylar öncesinden beri konuşuyorduk. Bir ORM (Object-relational mapping) aracı kullanacaktık ama hangisini ? Bu işlerin babası Hibernate .Net olanı içinse nHibernate gibi duruyordu fakat Microsoft’ un herzaman bir benzer aracı vardır. Tabi bu sırada son günlerde popülaritesini giderek artıran MVC (Model – View – Controller) vardı. Bunlar güzel şeyler fakat öğrenmek anlamak ciddi anlamda zaman alıyor ve kaynak anlamında da ciddi sıkıntılar çıkabiliyor. Burada araya Emre abi faktörü giriyor, açık konuşmak gerekirse ben yine bildiğimi okuyup hiç bir yeniliğe bulaşmadan amele işi kastıracaktım :)

Şu sorularla doğru cevapları aramaya çalıştık vede sanıyoruz ki bulduk;

  1. Biz projelerimizi nerede geliştiriyoruz ? .Net
  2. .Net in kendi orm araçları var mı ? Evet, var. Linq ve Ado.Net Entity
  3. Bir amacımızda tasarım, veritabanı ve kodları ayırmak. Bunu en güzel nasıl çözebiliriz ? Mvc
  4. Peki Linq mi Entity mi ? Mvc ile en uyumlu ve gelecekte Microsft’ un bu teknolojiye devam edip Linq’ i bırakacağı için Entity !

Kararlarımızı verdikten sonra kolları sıvayıp ilgili konular üzerinde ar-ge yapmaya başladık. Şuanda aklımıza gelen tüm senaryoları başarılı bir şekilde gerçekleştirmeyi başardık. Mvc ve Entity gerçekten muhteşem bir ikili. Genellikle büyük projelerde kullanılır gibi bir izlenim var fakat bence küçük projelerde bile rahatlıkla kullanılabilecek bir görüntüsü var. İlerleyen günlerde Mvc ve Entity ile ilgili güzel ve anlaşılır yazılar yazmayı düşünüyorum. Şimdilik konularla ilgili bir kaç adres vermek istiyorum.

Ado.Net Entity

  1. http://blogs.msdn.com/adonet/default.aspx
  2. http://cid-245ed00edb4c374e.skydrive.live.com/self.aspx/Public/entity%20framework%20learning%20guide.pdf
  3. http://msdn.microsoft.com/en-us/data/ee712908.aspx

Mvc

  1. http://www.asp.net/learn/mvc/
  2. http://www.asp.net/learn/mvc-videos/
  3. http://tr.wikipedia.org/wiki/Model-view-controller
  4. http://turhal.blogspot.com/

ASP.NET ile Google Api Kullanarak Hava Durumu Almak

Başlıktan da anlaşılacağı gibi Google Api yi kullanarak şehirlerin hava sıcaklığı, nem oranı, rüzgarın hızı gibi bilgileri alacağız. İstenilirse 5 günlük durum bilgisini de almamız mümkün fakat bu örnekte 1 günlük bilgiyi alacağız. İlk başta Meteoroloji müdürlüğünün yayınladığı bilgilerini kullanarak yapmak istedim fakat ne hikmetse sağlıklı çalışmıyor, muhtemelen bilginin çekildiğini anlayıp engelliyorlar. İlgilenenler için ilgili adres http://www.dmi.gov.tr/FTPDATA/analiz/sonSOA.xml burası. Buranın bir eksiği de görsellik için bir adres verilmemesi, bunun içinde ayrı bir mekanizmayla resimleri alıyordum, dünya kadar zaman harcamıştım ama elimde sadece koskoca bir hiç kaldı. İlgilenenlere kodları gönderebilirim.

Google Api ASP.NET C# Hava DurumuDönelim konumuza, nedenini bilmiyorum ama Google’ ya her konuda çok güveniyorum, dedim madem öyle Google’ nin hizmetini kullanayım. Klasik bir xml okuyucuyla (reader) bilgileri alıp istediklerimi aldım fakat ne göreyim gelen bilgiler İngilizce :| Tarayıcıdan adresi yazınca Türkçe kodlarla çekince İngilizce gelmesi hayra alamet değildi, neyse aradım taradım hl=tr parametresinin de eklenmesi gerektiğini anladım. Ama gelin görünki adres satırından bu bilgiyi gönderebilmek için & (ve (ampersand)) imininde olması gerekiyor. Bu imi direk XML adresi olarak veremiyorsunuz bunu zaten site haritası yaparken yıllar önce öğrenmiştik, yerine & ifadesini   yazıyorduk. Ama ne var ki bu şekilde istek   gönderdiğimde hiç bir değişiklik olmuyordu. Saatler geçiyor sinirden neyapacağımı nasıl bir izleyeceğimi bilmiyordum, kontrol çalışıyor fakat veriler İngilizce geliyordu, dedimki madem öyle Google Translate ile Türkçe’ ye çevireyim, hoop dedim yok daha neler altı üstü hava durumu gösterilecek. Şunu da söylemeliyim o kadar araştırmama rağmen hiç bir çözüme ulaşamadım en sonunda Google’ ya bile yazdım. Kulağı belki biraz sıkıntılı bir şekilde tuttum fakat saat gibi çalışıyor. Performans olarak da fena değil gibi. Şunu da belirtmek isterim, yazıyı bu kadar uzatmamda ki amaç zaman zaman ufak gibi görünenproblemler nedeniyle işlerin nasıl yoldan çıktığını göstermek.

Default.aspx

    <style type="text/css">
    body{
        font-family:Arial;
        font-size:13px;
    }
    .hava{
        padding:5px;
        border:1px solid #e7e7e7;
        border-right-width:2px;
        border-bottom-width:2px;
        width:250px;
    }
    .sehir{
        font-size:11px;
        background-color:#ffba00;
    }

    .ikon img{
       float:left;
       margin:5px;
    }

    .derece{
        color:#ffba00;
        font-size:15px;
        display:inline-block;
        margin-top:2px;
        font-weight:bold;
    }
    .nem,.ruzgar{display:block;font-size:9px;}
    </style>
 <div class="hava">
        <img src="http://www.google.com.tr/intl/tr/logos/Logo_50wht.gif" alt="Google" />
        <br />
         <asp:DropDownList runat="server" ID="ddlSehirler" CssClass="sehir">
            <asp:ListItem>ADANA</asp:ListItem>
            <asp:ListItem>ADIYAMAN</asp:ListItem>
            <asp:ListItem>AFYONKARAHİSAR</asp:ListItem>
            <asp:ListItem>AĞRI</asp:ListItem>
            <asp:ListItem>AKSARAY</asp:ListItem>
            <asp:ListItem>AMASYA</asp:ListItem>
            <asp:ListItem>ANKARA</asp:ListItem>
            <asp:ListItem>ANTALYA</asp:ListItem>
            <asp:ListItem>ARDAHAN</asp:ListItem>
            <asp:ListItem>ARTVİN</asp:ListItem>
            <asp:ListItem>AYDIN</asp:ListItem>
            <asp:ListItem>BALIKESİR</asp:ListItem>
            <asp:ListItem>BARTIN</asp:ListItem>
            <asp:ListItem>BATMAN</asp:ListItem>
            <asp:ListItem>BAYBURT</asp:ListItem>
            <asp:ListItem>BİLECİK</asp:ListItem>
            <asp:ListItem>BİNGÖL</asp:ListItem>
            <asp:ListItem>BİTLİS</asp:ListItem>
            <asp:ListItem>BOLU</asp:ListItem>
            <asp:ListItem>BURDUR</asp:ListItem>
            <asp:ListItem>BURSA</asp:ListItem>
            <asp:ListItem>ÇANAKKALE</asp:ListItem>
            <asp:ListItem>ÇANKIRI</asp:ListItem>
            <asp:ListItem>ÇORUM</asp:ListItem>
            <asp:ListItem>DENİZLİ</asp:ListItem>
            <asp:ListItem>DİYARBAKIR</asp:ListItem>
            <asp:ListItem>DÜZCE</asp:ListItem>
            <asp:ListItem>EDİRNE</asp:ListItem>
            <asp:ListItem>ELAZIĞ</asp:ListItem>
            <asp:ListItem>ERZİNCAN</asp:ListItem>
            <asp:ListItem>ERZURUM</asp:ListItem>
            <asp:ListItem>ESKİŞEHİR</asp:ListItem>
            <asp:ListItem>GAZİANTEP</asp:ListItem>
            <asp:ListItem>GİRESUN</asp:ListItem>
            <asp:ListItem>GÜMÜŞHANE</asp:ListItem>
            <asp:ListItem>HAKKARİ</asp:ListItem>
            <asp:ListItem>HATAY</asp:ListItem>
            <asp:ListItem>IĞDIR</asp:ListItem>
            <asp:ListItem>ISPARTA</asp:ListItem>
            <asp:ListItem>İSTANBUL</asp:ListItem>
            <asp:ListItem>İZMİR</asp:ListItem>
            <asp:ListItem>KAHRAMANMARAŞ</asp:ListItem>
            <asp:ListItem>KARABÜK</asp:ListItem>
            <asp:ListItem>KARAMAN</asp:ListItem>
            <asp:ListItem>KARS</asp:ListItem>
            <asp:ListItem>KASTAMONU</asp:ListItem>
            <asp:ListItem>KAYSERİ</asp:ListItem>
            <asp:ListItem>KIRIKKALE</asp:ListItem>
            <asp:ListItem>KIRKLARELİ</asp:ListItem>
            <asp:ListItem>KIRŞEHİR</asp:ListItem>
            <asp:ListItem>KİLİS</asp:ListItem>
            <asp:ListItem>KOCAELİ</asp:ListItem>
            <asp:ListItem>KONYA</asp:ListItem>
            <asp:ListItem>KÜTAHYA</asp:ListItem>
            <asp:ListItem>MALATYA</asp:ListItem>
            <asp:ListItem>MANİSA</asp:ListItem>
            <asp:ListItem>MARDİN</asp:ListItem>
            <asp:ListItem>MERSİN</asp:ListItem>
            <asp:ListItem>MUĞLA</asp:ListItem>
            <asp:ListItem>MUŞ</asp:ListItem>
            <asp:ListItem>NEVŞEHİR</asp:ListItem>
            <asp:ListItem>NİĞDE</asp:ListItem>
            <asp:ListItem>ORDU</asp:ListItem>
            <asp:ListItem>OSMANİYE</asp:ListItem>
            <asp:ListItem>RİZE</asp:ListItem>
            <asp:ListItem>SAKARYA</asp:ListItem>
            <asp:ListItem>SAMSUN</asp:ListItem>
            <asp:ListItem>SİİRT</asp:ListItem>
            <asp:ListItem>SİNOP</asp:ListItem>
            <asp:ListItem>SİVAS</asp:ListItem>
            <asp:ListItem>ŞANLIURFA</asp:ListItem>
            <asp:ListItem>ŞIRNAK</asp:ListItem>
            <asp:ListItem>TEKİRDAĞ</asp:ListItem>
            <asp:ListItem>TOKAT</asp:ListItem>
            <asp:ListItem>TRABZON</asp:ListItem>
            <asp:ListItem>TUNCELİ</asp:ListItem>
            <asp:ListItem>UŞAK</asp:ListItem>
            <asp:ListItem>VAN</asp:ListItem>
            <asp:ListItem>YALOVA</asp:ListItem>
            <asp:ListItem>YOZGAT</asp:ListItem>
            <asp:ListItem>ZONGULDAK</asp:ListItem>
        </asp:DropDownList><br />
        <span runat="server" ID="spnIkon" class="ikon"></span>
        <span runat="server" ID="spnDerece" class="derece"></span>
        <span runat="server" ID="spnDurum" class="durum"></span>
        <span runat="server" ID="spnNem" class="nem"></span>
        <span runat="server" ID="spnRuzgar" class="ruzgar"></span>
    </div>

Default.aspx.cs

try
        {
            string strGelenIl = Request.QueryString["Il"];
            if (string.IsNullOrEmpty(strGelenIl))
            {
                strGelenIl = "TRABZON";
            }
            WebClient webClient = new WebClient();
            string strKaynak = webClient.DownloadString("http://www.google.com/ig/api?weather=" + strGelenIl + "&hl=tr");
            TextReader trOkuyucu = new StringReader(strKaynak);
            webClient.Dispose();

            ddlSehirler.Attributes.Add("onchange", "location.href='?Il='+this.value+''");
            ddlSehirler.SelectedValue = strGelenIl;

            XmlTextReader rdr = new XmlTextReader(trOkuyucu);
            XmlDocument myxml = new XmlDocument();
            myxml.Load(rdr);
            XmlNodeList xnlHedef = myxml.SelectNodes("xml_api_reply/weather/current_conditions");

            string strDerece = xnlHedef.Item(0).SelectSingleNode("temp_c").Attributes["data"].InnerText;
            string strDurum = xnlHedef.Item(0).SelectSingleNode("condition").Attributes["data"].InnerText;
            string strNem = xnlHedef.Item(0).SelectSingleNode("humidity").Attributes["data"].InnerText;
            string strIkon = "<img src="\" alt="\&quot;&quot;" />";
            string strRuzgar = xnlHedef.Item(0).SelectSingleNode("wind_condition").Attributes["data"].InnerText;
            spnIkon.InnerHtml = strIkon;
            spnDurum.InnerText = strDurum;
            spnDerece.InnerText = strDerece + " °C";
            spnNem.InnerText = strNem;
            spnRuzgar.InnerText = strRuzgar;

            trOkuyucu.Dispose();
            rdr.Close();
            rdr = null;
            myxml = null;
            xnlHedef = null;
        }
        catch (Exception)
        {

        }

İlgili dosyaları buradan indirebilirsiniz. Bir yazının daha sonuna geldik, kalın sağlıcakla.

ASP.NET ile Dosya yükleme, listeleme ve silme işlemleri

Merhaba arkadaşlar, başlıktan da anlaşıldığı gibi asp.net ile dosya yükleme (file upload), yüklediğimiz dosyaları listeleme (file list) ve listelediğimiz dosyalardan seçileni fiziksel olarak silme işlemini göstermeye çalışacağım. Öncelikle şunu belirtmek istiyorum, bu örneğimizde veritabanı bulunmuyor, yani işlemlerimizi direk klasör içindeki dosyalar ile yapacağız.

Öncelikle yeni açtığımız projemizin içine dosyalar adında bir klasör açıp, bu klasöre yazma izni veriyoruz. İlk önce default.aspxsayfamızın kodlarına bakalım.

<asp:FileUpload ID="FileUpload1" runat="server" />
<asp:Button ID="Button1" runat="server" Text="Button" onclick="Button1_Click" />
<asp:Label runat="server" ID="mesaj"></asp:Label>
<asp:Label runat="server" ID="lblyd"></asp:Label>
<asp:DropDownList runat="server" ID="ddl"></asp:DropDownList>
<asp:LinkButton runat="server" ID="btnsil" Text="Seçilen dosyayı sil !" onclick="btnsil_Click"></asp:LinkButton>

Şimdide default.aspx.cs kodlarımıza bakalım

using System;
using System.Configuration;
using System.Data;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.IO;

public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
yuklenenDosyalar();
}
}
protected void yuklenenDosyalar() {
DirectoryInfo klasor = new DirectoryInfo(MapPath("dosyalar"));
ddl.DataSource = klasor.GetFiles();
ddl.DataBind();
lblyd.Text = ddl.Items.Count + " adet yüklenmiş dosya ! ";
if (ddl.Items.Count == 0)
{
ddl.Items.Add("Yüklenmiş dosya bulunmuyor.!");
ddl.Enabled = false;
btnsil.Visible = false;
}
}
protected void Button1_Click(object sender, EventArgs e)
{
if (FileUpload1.HasFile)
{
try
{
FileUpload1.SaveAs(Server.MapPath(@"dosyalar\" + FileUpload1.FileName));
string uzanti = System.IO.Path.GetExtension(FileUpload1.FileName).ToLower();
mesaj.Text = "Dosya başarıyla yüklendi !
";
mesaj.Text += "Dosya adı: " + FileUpload1.FileName + "
";
mesaj.Text += "Dosya türü: " + FileUpload1.PostedFile.ContentType + "
";
mesaj.Text += "Dosya boyutu: " + FileUpload1.PostedFile.ContentLength + "byte
";
mesaj.Text += "Dosya uzantısı: " + uzanti + "
";
ddl.Enabled = true;
yuklenenDosyalar();
}
catch (Exception)
{
mesaj.Text = "Bir hata oluştu ve dosya yüklenemedi ! Muhtemelen ilgili klasörün yazma izni bulunmuyor.";
}
}
else
{
mesaj.Text = "Lütfen dosya seçiniz !";
}
}
protected void btnsil_Click(object sender, EventArgs e)
{
File.Delete(MapPath("dosyalar/"+ddl.SelectedValue));
mesaj.Text = ddl.SelectedValue + " Dosyası başarıyla silindi !";
yuklenenDosyalar();
}
}

Görüldüğü üzere dosyaları yüklemek, listelemek ve silmek gerçekten çok basit. Burada en genel şekliyle örnek vermeye çalıştım, eğer istersek basit bir if bloğuyla sadece jpeg uzantılı dosyalar veya boyutu 10kb den küçük dosyalar yüklenebilir gibi filtrelerde koyabiliriz. Herkese iyi çalışmalar.