Duyuruyu Kapat
Facebook Gözat
Twitter Gözat

üyeler arası mesajlaşma/mesaj cevaplama

Konu, 'ASP.NET / Silverlight / Moonlight' kısmında trgevent tarafından paylaşıldı.

  1. trgevent

    trgevent Yeni Üye

    Kayıt:
    19 Mart 2012
    Mesajlar:
    5
    Beğenilen Mesajlar:
    0
    merhaba,
    öncelikle site içinde üyeler arası mesajlaşma ile ilgili neredeyse tüm yazılanları okudum.
    kendime ait aspnet+mssql ile hazırladığım ve pek çok mesajlaşma sistemine benzer bir yapı var,gelen mesaj/giden mesaj/mesajoku/mesajyaz vb..
    öğrenmek istediğim konu şu: x üye y üyeye mesaj attı,y üye mesajı okudu ve yanıtla butonuna bastı,işte tam bu noktada tıkanıyorum.
    mesaj yanıtlama sayfasına x'den gelen mesajı taşımak,aynı zamanda y'nin cevabını yazdırmak istiyorum.
    kabaca yapmak istediğim aşağıdaki gibi,pek çok mail programındaki gibi orjinal mesajı da göstererek yanıt yazmak.
    veritabanında kimden-kime-mesaj gibi alanlarım var,yanıtlama işlemi için veritabanında ayrı bir saha oluşturmalımıyım?
    ek olarak,ilk gelen mesaj (orjinal mesaj) ile yanıtları (1 ana mesaj ve x ile y nin ikişer adet yanıtları olabilir) ilişkilendirmelimiyim,öyleyse nasıl?
    kafamda oturtamadım bir türlü,yönlendireiblir ya da varsa makale önerebilirseniz sevinirim.


    y'nin cevabı

    ---------------------------------------------------------------
    kimden:x
    kime:y
    konu:deneme
    mesaj:nbr
     
  2. 00

    00 Üye

    Kayıt:
    30 Mart 2010
    Mesajlar:
    120
    Beğenilen Mesajlar:
    0
    Meslek:
    Ogrenci
    Şehir:
    Kirmizi konteyner'in ustu
    Merhabalar,

    Oncelikler veritabani tasarimindan baslayalim;

    Uyeler tablosu

    UyeID - int
    Adi - nvarchar(50),
    Soyadi - nvarchar(50),
    Yas - int,
    Email - nvarchar(50)

    Mesajlar tablo

    MesajID - int,
    GonderenID - int,
    GonderilenID - int,
    MesajBaslik - nvarchar(100),
    Mesaj - nvarchar(max),
    Tarih - datetime

    ek olarak OkunduMu gibi durumlarda koyabilirsin o da sana kalmis.

    UyeID > GonderilenID
    UyeID > GonderenID

    Diagram baglantilarin bu sekilde olacak.

    Senaryomuzuda soyle yapalim 1 adet dropdown, 2 adet textbox yeterli
    Eger istersen multiview kullanarak daha kullanisli hale getirebilirsin. (dropdown event'inde mesaj atilacak kullanici secildikten sonra multiview ile textboxlari acarsin. Hatta abartik updatepanel 'de kullanabilirsin)

    DropDownList1.DataTextField = "Adi";
    DropDownList1.DataValueField = "UyeId";

    sayfan postback oldugunda dropdownlist'te sectigin item'in (uyenin) degismemesi icin page_load event'inde bu kontrol'u yapman gerekiyor.

    if (IsPostBack)
    {
    return;
    }

    GonderenID mesaji gonderecek kisinin UyeID si olacak, GonderilenID mesaj gonderilen kisi olacak.

    GonderilenID'yi zaten dropdownlistimizin datavaluefiled ozelliginde tutuyoruz.
    Giris yapan kullanicinin UyeID'sini = Session["UyeID"].ToString(); tuttugunu varsayiyorum. Bu da GonderenID oluyor.

    mesaj gonderme butonunda ise mesaji gonderme cumleni su sekilde kurabilirsin.

    sqlcommand cmd = new sqlcommand("INSERT INTO Mesajlar(GonderenID,GonderilenID,MesajBaslik,Mesaj) values(@GonderenID,@GonderilenID,@MesajBaslik,@Mesaj)",baglantin);
    cmd.Parameters.AddWithValue("@GonderenID", Session["UyeID"].ToString());
    cmd.Parameters.AddWithValue("@GonderilenID", DropDownList1.SelectedValue);
    cmd.Parameters.AddWithValue("@MesajBaslik", txtMesajBaslik.Text);
    cmd.Parameters.AddWithValue("@Mesaj", txtMesaj.Text);
    cmd.ExecuteNonQuery();
    lblBilgi.Text = "Mesajınız Başarılı Bir Şekilde Gönderildi";

    Tarihi sql'de tutatlim daha spesifik bir hal alir. Tarih kolonunun Default Value ozelligini getdate() yazalim. (Kayit yapildigindaki tarihi alacaktir.)

    Boylelikle 2 UyeID'sini yani Gonderen ve Gonderilen + mesaji tutuyoruz. Yani bize lazim olan hersey veritabanimizda suan ekli.

    Geriye kalan islemler; Kullanicinin posta kutusunda mesaji okutman ve yanitla islemini yapman.

    Kullaniciya mesaj gidip gitmedigini sql sorgunun sonundaki Where cumlenle belirliceksin.
    (Uyeler ve Mesajlar tablosunu joinlemen lazim)

    string UyeID = Session["UyeID"].ToString();

    Where GonderilenID=" + UyeID

    Gonderdigi mesajlarida tutabilirsin. Where GonderenID=" + UyeID

    Zaten Session elinde istediginde her ciktiyi alabilirsin.

    Simdi yanitla kisminda cok fazla secenek var. Onemli olan mesaj gonderen kisinin UyeID'sine ulasabilmek.

    Ilk islemdeki mesaj gonderme kismindaki gibi bir dropdownlist kullanip tum kullanicilari oraya bind edip ordan GonderenID'sine esit olan uyeyi page_load eventinde sectirtebilirsin bu hem daha kullanisli olur belki onun yolladigi mesaji baskasina gondermek istersin.

    Yanitla butonuna bastiginda tekrar multiview kullanabilirsin asagiya 1 textbox acarsin.

    sqlcommand cmd = new sqlcommand("INSERT INTO Mesajlar(GonderenID,GonderilenID,MesajBaslik,Mesaj) values(@GonderenID,@GonderilenID,@MesajBaslik,@Mesaj)",baglantin);
    cmd.Parameters.AddWithValue("@GonderenID", Session["UyeID"].ToString());
    cmd.Parameters.AddWithValue("@GonderilenID", DropDownList1.SelectedValue);
    cmd.Parameters.AddWithValue("@MesajBaslik", txtMesajBaslik.Text);
    cmd.Parameters.AddWithValue("@Mesaj", txtMesaj.Text);
    cmd.ExecuteNonQuery();
    lblBilgi.Text = "Mesajınız Başarılı Bir Şekilde Gönderildi";

    Belki bir gonderilen mesaj yanit olarakta veritabanini degistirebilirsin istedigin gibi.
    Boyle yaparsan tam olarak istedigin gibi bir sonuc alabilecegini dusunuyorum.

    Aslinda mesajlasma olayi tamamen senin yaraticiligina kalmis mantigini anlaman ve dogru veritabani tasarimini kurman cok onemli.

    Kolay gelsin.