HttpContext etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
HttpContext etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster

22 Eylül 2010 Çarşamba

HTTPContext in EventHandler

Listemizde item eklerken, ekledikten sonra vs. yapmak istediğimiz işlemler için veya filedlerdeki dataların kontrolü için EventReceiver geliştirebilir ve eklenen dataya göre işlemler yapabiliriz.

Sharepoint 2010 yeniliği olan validationlarla kolonlardaki kontrolleri sağlayabilir ve EventReceiver geliştirmeye gerek olmayabilir veya "Sharepoint 2010 Event Handler ve Hata Sayfası" başlıklı yazımda da belirttiğim üzere başka bir sayfaya yönlendirmek için

properties.Status = SPEventReceiverStatus.CancelWithRedirectUrl;
properties.RedirectUrl = "/_layouts/MyCustomPage.aspx";

EventReceiver'ın statüsünü "CancelWithRedirectUrl" yaptıktan sonra yönelenicek sayfayı yazarak sayfa yönlendirmesi yapabiliriz.

Ancak sayfa yönlendirme yapmak istediğimizde SPUtility.Redirect methodunun çağırmak istediğimizde HttpContext tipinden bir parametre istemekte veya Response.Redirect methodunu bulamamaktayız bu sıkıntı yukarıdaki şekilde bir bakıma Sharepoint 2010 ile çözülebilirken MOSS 2007 de daha çok karşımıza çıkmaktadır.

EventReceiver'a HttpContext eklemeyi aşağıda bulabileceksiniz ancak onun öncesinde SPUtility.Redirect methodunun yönlendirme yapmadığını bundan dolayı Response.Redirect methodunu kullanmamız gerektiğini belirtmek isterim.

EventReceiverımızı oluşturduğumuz isimle aynı olacak şekilde base() den türetilecek bir method ve global oluşturacağımız HttpContext tipinden değişken ile bu işi çözebileceğiz :)

Bununla ilgili örnek kodu aşağıda bulabilirsiniz.
/// 
/// List Item Events
/// 
public class TestHttpContext : SPItemEventReceiver
{
    private HttpContext _currentContext = null;
 
    public TestHttpContext() : base()
    {
        if (null != HttpContext.Current)
        {
            _currentContext = HttpContext.Current;
        }
    }
 
    /// 
    /// An item is being added.
    /// 
    public override void ItemAdding(SPItemEventProperties properties)
    {
        base.ItemAdding(properties);
        string url = "http://www.yahoo.com/?n=" + _currentContext.User.Identity.Name;
        _currentContext.Response.Redirect(url);
    }        
}

8 Temmuz 2010 Perşembe

Linq To Sharepoint ile alt sitede bulunan veriye üst siteden ulaşabilmek

Yukarıdaki çizimde de görüleceği üzere http://sps2010 sitemde bulunan webpartdan http://sps2010/sites/mavi sitemde bulunan listeye bağlanıp Müşterileri çekmek istemekteyim ancak Mavi adlı siteme bağlanamamakte ve "Web at http://sps2010/sites/mavi/ could not be found." hatası vermektedir.Bağlantıyı sağlayamayan örnek kod aşağıdaki gibidir:

using (EntitiesSps2010Mavi.EntitiesSps2010MaviDataContext dataContext = new EntitiesSps2010Mavi.EntitiesSps2010MaviDataContext("http://sps2010/sites/mavi/"))
{
var musteriler = from musteriListesi in dataContext.Musteriler
orderby musteriListesi.Title
select musteriListesi;
if (musteriler != null)
{
lvMusteriler.DataSource = musteriler.ToList();
lvMusteriler.DataBind();
}
}
Ancak HttpContext'i bağlanmak istediğimiz siteye set ettikten sonra herhangi bir sorun yaşamamakta ve Müşterileri listeleyebilmekteyim.Bağlantıyı sağlayan örnek kod aşağıdaki gibidir:
HttpContext currentContext = HttpContext.Current;

SPSecurity.RunWithElevatedPrivileges(delegate()
{
using (SPSite site = new SPSite("http://sps2010/sites/mavi/"))
{
using (SPWeb web = site.OpenWeb())
{
HttpRequest httpRequest = new HttpRequest("", web.Url, "");
HttpContext.Current = new HttpContext(httpRequest, new HttpResponse(new StringWriter()));
SPControl.SetContextWeb(HttpContext.Current, web);
using (EntitiesSps2010Mavi.EntitiesSps2010MaviDataContext dataContext = new EntitiesSps2010Mavi.EntitiesSps2010MaviDataContext("http://sps2010/sites/mavi/"))
{
var musteriler = from musteriListesi in dataContext.Musteriler
orderby musteriListesi.Title
select musteriListesi;
if (musteriler != null)
{
lvMusteriler.DataSource = musteriler.ToList();
lvMusteriler.DataBind();
}
}
}
}
});
HttpContext.Current = currentContext;
Mavi adlı siteme bağlantıyı gerçekleştirip Context'i değiştirdikten sonra bir sorunla karşılaşmadım.
Dikkat edilmesi gereken nokta kodun en üst ve en alt satırında da görüldüğü üzere CurrentContext'i bağlantı yapılmadan önce tutmak ve işimiz bittikten sonra tekrar atamak.

SPMetal ile Entity kodumu Mavi adlı siteden çıkarttım bunun sebebi de Müşteriler listemin orada bulunmasından dolayıdır.