MVC'de Ajax ile ViewUserControl'ü render edip dinamik olarak sayfa içine yerleştirmek nasıl yapılır?

April 29, 2009 at 1:48 PMoozturk

Merhaba,

Web Forms kullanırken ajax ile UserControl sürekli kullanıyorduk peki ya MVC'de nasıl yapılıyor? MVC ile geliştirilen projelerde ViewUserControl ve ViewPage dosyalarına karşılık gelen nesneler olmadığı ya da tipleri olmadığı için new komutuyla çağırmak mümkün değil. Ayrıca ViewData ve ViewData.Model kullanılmak istenilebilir. Bu sebeplerle farklı bir yol izlemek gerekiyor.

1. Öncelikle bu iş için MVCContrib kütüpanesi gerekiyor. Bu kütüphanede MVC  için birçok yeni kolaylık var. İndirmek için www.codeplex.com/MVCContrib adresini ziyaret edin. İndirdikten sonra projenize referans olarak MvcContrib.dll dosyasını ekleyin.

2. Aşağıda sunduğum kodu projenizin içinde istediğiniz bir yere koyun

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Configuration;
using System.Data;
using System.Data.SqlClient;
using System.Web.Mvc;
using System.Web.Mvc.Html;
using System.Security.Principal;
using MvcContrib.UI;

public static string RenderPartialToString( string userControl, ViewDataDictionary viewData, TempDataDictionary tempdata, ControllerContext controllerContext )
        {
            HtmlHelper h = new HtmlHelper( new ViewContext( controllerContext, new WebFormView( "message" ), viewData, tempdata ), new ViewPage() );
            var blockRenderer = new BlockRenderer( controllerContext.HttpContext );

            string s = blockRenderer.Capture(
                () => RenderPartialExtensions.RenderPartial( h, userControl, viewData )
            );

            return s;
        }

 

3. Bir Controller içine aşağıdaki gibi bir action'ı yazın

        public ContentResult GetEditView()
        {

            //Vıewdata içine ya da model'e birşey eklemek ya da değiştirmek istiyorsanız bunu burada yapın daha sonra aşağıdaki adımlara devam edin.
            string s= MvcStuff.RenderPartialToString( "/Views/deneme/EditView.ascx", ViewData, TempData, this.ControllerContext );
            return new ContentResult()
            {
                Content = s
            };
        }

4. Bu action'ı istediğiniz sayfa ya da ViewUserControl içinden Ajax.ActionLink ile ekleyin.

<%=        Ajax.ActionLink( "buraya basın", "GetEditView", new
          {
              Controller = "deneme"
          }, new AjaxOptions
          {
              UpdateTargetId = "mesedit"
          } )
 %><div id="mesedit">

</div>

5. Masterpage kullanıyorsanız oraya kullanmıyorsanız sayfa içine gerekli javascript kütüphanelerini ekleyin

    <script src="../../Scripts/jquery-1.3.2.js" type="text/javascript"></script>
    <script src="../../Scripts/MicrosoftAjax.js" type="text/javascript"></script>
    <script src="../../Scripts/MicrosoftMvcAjax.js" type="text/javascript"></script>

Bu kadar basit. Şu anda eğer aynı mantık ile yazdıysanız mesedit diye adlandırdığım div içinde usercontrol'ünüz gösterilecektir ve orada çalışacaktır. Elbette %100 Ajax. :-)

Bu arada eğer usercontrol bulunamadı diye bir hata alıyorsanız bir viewengine yazmadınız demektir. Bunun için de viewengine örneği için yazdığım yazıyı okumanızı tavsiye ederim.

Bu kütüphaneler ve jQuery sayesinde isterseniz fade gibi animasyonlar ekleyebilir, görünümü daha da güçlendirebilirsiniz.

İyi günler!

Posted in: Ajax | MVC

Tags: , , , ,

XmlHttpRequest nedir, nasıl kullanılır? JSON kullansak bir sakıncası olur mu? Nasıl kullanmalı bu JSON'ı?

February 23, 2009 at 5:08 AMoozturk

Selamlar,

XmlHttpRequest; Microsoft'un dünyaya (bayağı bir zaman oldu ama) dinamik internet sayfalarını armağan etme yoludur. Bu özellikten vaz geçmek istediğiniz anda, statik sayfalara geri dönmüş oluyorsunuz. Asenkron ya da senkron olarak yüklenmiş olan sayfada dinamik içerik hazırlamaya yarar. Ajax dediğimiz dünya zaten bu komut üstüne kurulmuştur desek yerinde bir tespit olur. Eğer javascript ile istemci (client) tarafında sunucudan (server) dinamik olarak içerik almak ve işleyip kullanıcıya sunmak istiyorsak bukomutu kullanmak isteriz.

Bildiğimiz ve hergün acı olarak tecrübe ettiğimiz gibi internet için çok sayıda standart var ama hiç standart yok! Ne demek bu? Biri birşey yaratıyor, başkaları alternatiflerini üretiyor sonra içlerinden bir ya da birkaçı tutuyor ve internet standardı olma yolna giriyor, sonra üretenler aralarında konuşup bunu standart haline getiriyorlar ama bu seferde hepsinin yoğurt yeme stili farklı oluyor. Çok uzattım ama ne yazık ki bu komut için de bu olay geçerli. Eğer XmlHttpRequest kullanmak istiyorsanız, Javascript ile bu komutu bir nesne gibi yaratmanız gerekiyor ve her tarayıcıda (browser) bu işlem farklı oluyor. Microsoft bunu daha önceden ActiveX nesnesi olarak tanıtmıştı mesela...

Aşağıdaki kod ile XmlHttpRequest nesnenizi tanımlayabilirsiniz:

<script type="text/javascript" language="javascript">
    var xmlhttp = false;

    function getHttpRequestObj()
    {
        try
        {
            //bir deneyelim bakalim
            xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
        }
        catch(e)
        {
            try
            {
                //simdi guncel IE implementasyonu deneyelim
                xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
            }
            catch(e)
            {
                xmlhttp = false;
            }
        }
       
        if(!xmlhttp && typeof XmlHttpRequest!= 'undefined')
        {
            //Eh, artik mozilla tabanli bir tarayici kullaniyoruzdur
            //o zaman ona gore bir nesne tanimlayalim
            xmlhttp = new XmlHttpRequest();
        }
    }
</script>

 

Şimdi bu script ile sayfa içerisinde kullanabileceğimiz xmlhttp adında bir XmlHttpRequest nesnemiz oldu. Artık bununla istediğimiz gibi text, xml ya da json tabanlı içerikler alabilir ve işleyebiliriz. İşin doğrusu benim favorim JSon, çünkü xml'den de text'den de çok daha verimli ve performanslı. Üstüne üstlük geri dönen değer direk olarak javascript nesnesi olarak kullanılabiliyor yani bir daha işlemeye gerek kalmıyor.

 

Bir örnek vereyim. Bir sayfanızda, sayfanızla aynı klasörde bulunan bir txt dosyasından içerik almak ve göstermek istiyorsunuz diyelim:

getHttpRequestObj();

if(xmlhttp)
{
    xmlhttp.open("GET", "Deneme.txt", true);
    xmlhttp.onreadystatechange = function()
    {
        if(xmlhttp.readystate == 4)
        {
            alert(xmlhttp.responseText);
        }
    }
    xmlhttp.send(null);
}

 

Yukarıdaki örnekte, sayfamızla aynı klasörde bulunan Deneme.txt adlı dosyamızı çağırdık ve içeriğini mesaj kutusuyla gösterdik. Bunu yaparken bazı şeyler yaptık,onları da açıklayayım.

Öncelikle xmlhttp.onreadystate - function()... diye bir komut yazdık. Bu resmen bir event'i handle etmekti. Yani tanımlamış olduğumuz bir başka fonksiyon varsa onu da gösterebilirdik bu event için. Ayrıca xmlhttp.readystate diye bir değişkenin değerinin 4 olup olmadığına baktık, bu da xmlhttp nesnesinin durumunu kontrol etmek içindi. Tahmin ettiğiniz üzere 4 değeri 'tamamlandı' anlamına geliyor.

Diğer durumlarda şöyle:

0 - Henüz hazırlanmadı (Uninitialized)

1 -  Yükleniyor (Loading)

2 - Yüklendi (Loaded)

3 - Etkileşimli (Interactive)

4 - Tamamlandı (Complete)

 

Evet, şu anda bu kod çalışır durumda. Ama henüz gerçek dünyada kullanılabilecek düzeyde değil. Neden mi? Mesela bazen bazı kaynaklara ulaşmakta problemler yaşanır, bu durum için herhangi bir önlem almadık bu kodda. Bunu da ekleyelim şimdi:

if(xmlhttp)
{
    xmlhttp.open("GET", "Deneme.txt", true);
    xmlhttp.onreadystatechange = function()
    {
        if(xmlhttp.readystate == 4)
        {
            if(xmlhttp.status == 200)
            {
                alert(xmlhttp.responseText);
            }
            else
            {
                alert("Aman Allahim! Problem Oldu...");
            }
        }
    }
    xmlhttp.send(null);
}

 

Evet, burada xmlhttp.status == 200 diye bir kontrol eklemiş olduk, bu da tahmin ettiğiniz gibi http için status değeridir. Misal, eğer dosya bulunamamış olsaydı 404 değerini alacaktık, ya da sunucu hatası olsaydı 500 alacaktık. Bunlar için de kontroller ekleyebilirsiniz.

 

Esasen kendi sitenizde barındırdığınız ve kontrol etmiş olduğunuz şeylere erişim sorunu yaşamazsınız ancak dışarıdaki bir kaynağa erişmeye çalışırken bu tür durumlar için dikkat etmek gerekir (Bence içeride de olsa dikkat etmekte yarar var, çünkü bazen bir içeriği değiştirirken ya da bir şeyin yerini değiştirirken nerelerde kullanıldığını unutabiliriz).

Tabi bu örnekte kullandığımız gibi sadece text dosyaları için kullanılmıyor bu komut, yukarıda da belirttiğim gibi xml gibi içeriklerde kullanılabilir ki sadece dosya olarak da kullanılmıyor, misal bir web servis de kullanabilirdik.

 

Düşünelim. Bir web servisimiz olsa, içinde veritabanımızdan bir liste çeksek ve xml olarak fonksiyondan geri döndürsek, bunu da xmlhttp nesnemizle belirli zaman aralıklarıyla çekip çekip kontrol etsek? Evet, bu yapılan birşey ve kullanım alanlarından biri. Bu gibi durumlarda en yukarılarda da yazdığım gibi xml yerine JSon tavsiye ediyorum, çünkü xmlden çok daha az yer tutuyor bu da veriyi daha çabuk elde etmek, kullanılan bant genişliğini düşürmek gibi anlamlara geldiği gibi ayrıca bir de JSon tipini XML gibi işlemek zorunda kalmadan eval komutuyla direk olarak bir javascript değişkenine atayıp kullanabiliyoruz. Evet işte bu gerçekten süper bir durum. Örnek vereyim.

Bir dosyamız olsun yine (Örnek kolay olsun diye böyle yapıyorum), adı da Deneme2.txt olsun. İçine de aşağıdaki gibi birşey yazalım.

{ "Results": {
    "toplam_kitap" : "2",
    "kitap" : [
    {
        "Yayinevi" : "Ayrinti",
        "Tur" : "Yeralti Edebiyati",
        "Fiyat" : "10"
    },
    {
        "Yayinevi" : "Can",
        "Tur" : "Dunya Klasigi",
        "Fiyat" : "7"
    }
         ]
          }
}

 

Bu dosyayı kaydedelim. Ve aşağıdaki kodu html kodumuza yazalım:

<script type="text/javascript" language="javascript">
    var xmlhttp = false;

    function getHttpRequestObj()
    {
        try
        {
            //bir deneyelim bakalim
            xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
        }
        catch(e)
        {
            try
            {
                //simdi guncel IE implementasyonu deneyelim
                xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
            }
            catch(e)
            {
                xmlhttp = false;
            }
        }
       
        if(!xmlhttp && typeof XmlHttpRequest!= 'undefined')
        {
            //Eh, artik mozilla tabanli bir tarayici kullaniyoruzdur
            //o zaman ona gore bir nesne tanimlayalim
            xmlhttp = new XmlHttpRequest();
        }
    }

    getHttpRequestObj();

    function CallBack()
    {
        if(xmlhttp)
        {
            xmlhttp.open("GET", "Deneme2.txt", true);
            xmlhttp.onreadystatechange = function()
            {
                if(xmlhttp.readystate == 4)
                {
                    if(cmlhttp.status == 200)
                    {
                        eval("var objResults = " + xmlhttp.responseText);
                        var displayText;
                        for(var i=0; i < objResults.Results.kitap.length; i++)
                        {
                            displayText += objResults.Results.kitap[i].Yayinevi + " " +
                                    objResults.Results.kitap[i].Tur + ", " +
                                    objResults.Results.kitap[i].Fiyat + "TL<br/>";
                        }
                        alert(displayText);
                    }
                    else
                    {
                        alert("Aman Allahim! Problem Oldu...");
                    }
                }
            }
            xmlhttp.send(null);
        }
    }
    CallBack();
</script>

 

Evet, işte bu kadar basit. Tabii biz burada Deneme2.txt diye bir dosya yarattık ve elimizle doldurduk ama dediğim gibi bu örneğin maksadı XmlHttpRequest'i göstermekti bu sebeple diğer detaylarla boğmak istemedim yazıyı. Normalde bir web servis hazırlamak ve geri dönecek değeri JSon tipine parse etmek gerekecekti. Bunlar için de aşağıda kısayollar vereceğim.

 

Bütün bunların yanı sıra birkaç detay daha vermek istiyorum. Mesela hazırladığımız Deneme2.txt dosyasının formatı JSon ama bu JSon da '{' ya da '[' ne anlama geliyor?

Object(s): '{}' ile başlayıp bitiyorlar.

Object Member(s):  Bunlar name - value eşlemesi olarak yer alıyorlar. Name ve value arasında ':'kullanılıyor ve diğer üyeler arasında ise ',' kullanılıyor

Array(s): Bunlar string, number, object, array veya literal value (true, false) ya da null olabiliyorlar.

String(s): Bildiğimiz string.

 

Bunun yanı sıra  bir de XmlHttpRequest nesnesinin metodları (methods) ve özelliklerinden (properties) de bahsetmek istiyorum.

Methods:

- abort()

     İsteği iptal eder.

- getAllResponseHeaders()

     Bütün Http Header değerlerini getirir.

- getResponseHeader()

     Belirtilen Http Header değerini getirir.

- open()

     İstek nesnesini belirtilen metod, url ve güvenlik bilgileriyle yapılandırır. (Yukarıda hep tek parametreli olarak kullandık ancak ilk parametrede açılacak kaynağı belirttikten sonra kullanıcı adı ve şifre de belirtebilir ve güvenlik için giriş yapabilirdik).

- send()

     Sunucuya bi istek gönderip cevap alır.

- setRequestHeader()

     Bir Http header'ın değerini değiştirir.

 

Properties

- onReadyStateChange (Okuma / Yazma)

      ReadyState değiştiğinde tetiklenecek olan event için kullanılacak olan fonksiyonu değiştirir.

- readyState (Okuma)

     Nesnenin mevcut durumunu alır.

- responseBody (Okuma)

     Http response için kullanılabilecek özelliklerden biri.

- responseStream (Okuma)

     Http response için kullanılabilecek özelliklerden biri.

- responseText (Okuma)

     Response body, string formatında.

- responseXML (Okuma)

     Response body, xml formatında.

- status (Okuma)

     İstek için geri dönen durum değeri (200 = OK, 404 = Yok, 500 = server hatası, ...)

- statusText (Okuma)

     İstek için geri dönen durumun text'ini döndürür.

 

Şimdilik bu kadar. Bu konuda daha çok yazı yazmaya ve örnekler vermeye çalışacağım.

Bu konularda bakımlası gereken bazı siteler:

http://www.json.org

http://www.json.com

http://blogs.techrepublic.com.com/security/?p=426

Posted in: Web Service | Ajax | Html | Javascript | Json

Tags: , , , , ,

Javascript, web service, ajax ve membership kullanarak kullanıcı adı ya da e-posta uygunluk ya da kullanılabilirlik kontrolü

January 9, 2009 at 5:22 AMoozturk

Birçok alanda kullanıcının doldurduğu alanları kontrol etmek isteriz. Misal olarak kullanıcının bir web sitesine kayıt olmak istemesi durumunda, bu kullanıcı adının ya da belirtilen e-posta adresinin daha önce sisteme kayıt edilmiş olup olmadığını kontrol etmek ve buna göre kullanıcıyı yönlendirmek isteriz. Bu gibi durumlarda server side kontrol etmek çok da istenen bir durum olmaz, çünkü sayfanın tekrar çalıştırılması anlamına geldiği için yavaşlık olur ve hatta kullanıcının o esnada doldurduğu bazı alanlar da silinebilir. En doğru yöntem javascript vasıtasıyla web service ve ajax kullanarak client side bu işi çözmek gözüküyor.

Bir örnek ile kullanımını anlatmaya çalışacağım. Mesela senaryomuzda bir websitesinin kayıt işlemi için kullanıcı e-posta adresini belirtiyor olsun, bu e-posta adresi sisteme kayıtlı mı bunu belirlemek isteyelim. Tabi bir de girilen e-posta adresi doğrumu ona da bakalım. E-posta adresinin format'ının doğru olup olmadığının kontrolü sayesinde web service'imizide gereksiz zamanlarda çağırmamıza gerek kalmadığı için site trafiğini de azaltabiliriz.

1. adım: Bir web service ekleyelim projemize, mesela UserService.asmx olsun ve aşağıdakine benzer bir  koda sahip olmamız gerekiyor. Burada dikkat edilecek husus [System.Web.Script.Services.ScriptService] satırının kesinlikle eklenmiş olması, yoksa ajax ya da script vasıtasıyla çağırılmasına izin verilmez.

using System;
using System.Collections.Generic;
using System.Web;
using System.Web.Services;
using System.Web.Security;

[WebService(Namespace = "http://www.tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.Web.Script.Services.ScriptService]
public class UserServices : System.Web.Services.WebService {

    public UserServices () {

    }

    [WebMethod]
    public bool IsUsernameAvailable(string CheckFor) {
        if (Membership.GetUser(CheckFor, false) == null)
            return true;
        else
            return false;
    }
}

3. adım: Bir sayfa yaratalım. Mesela default.aspx olsun.

4. adım: Bu sayfaya bir ScriptManager ya da ToolkitScriptManager ekleyelim.

5. adım: Eklediğimiz ScriptManager'ın services özelliğine yarattığımız web service'i ekleyelim. Ekledikten sonra aşağıdakine benzer bir kod elde edilmiş olması gerekiyor.

<cc1:ToolkitScriptManager ID="ToolkitScriptManager1" runat="server">
   <Services>
      <asp:ServiceReference Path="~/services/UserServices.asmx" />
   </Services>
</cc1:ToolkitScriptManager>

6. adım: Sayfamıza bir TextBox ekleyelim  adını txtEmail koyalım ve bir Label koyalım adını da lblErr koyalım.

7. adım: Sayfamızın Page_Load event'ine aşağıdaki kodu koyalım.

txtEmail.Attributes.Add("onkeyup", "checkName()");

8. adım: Sayfamızın koduna aşağıdaki javascript'i ekleyelim.

    <script type="text/javascript">
        function checkName() {
            var eml = document.getElementById(<% ="\'" + txtEmail.ClientID + "\'" %>);
            var regexf  =  /(^[a-z]([a-z_\.]*)@([a-z_\.]*)([.][a-z]{3})$)|(^[a-z]([a-z_\.]*)@([a-z_\.]*)(\.[a-z]{3})(\.[a-z]{2})*$)/i;

            if(regexf.test(eml.value))
            {
                UserServices.IsUsernameAvailable(eml.value, onIsAvailableCompleted);
            }
        }
        function onIsAvailableCompleted(result) {
            if(result != null)
            {
                alert(result);
                var lblErr = document.getElementById(<% ="\'" + lblErr.ClientID + "\'" %>);
                if(result)
                {
                    lblErr.innerText = 'E-postaniz kontrol edildi.';
                    lblErr.style.color='green';
                    }
                else
                {
                    lblErr.innerText = 'Bu kullanici zaten mevcut, baska bir kullanici deneyin.';
                    lblErr.style.color='red';
                    }
            }
        }

    </script>

 Bu kadar. checkName fonksiyonu içine yazdığımız regexf değişkeni e-posta için validator olarak kullanılıyor ve txtEmail içine kullanıcının yazmış olduğu yazının format'ını kontrol ediyor, eğer doğru bir e-posta formatındaysa o zaman web service'in IsUsernameAvailable fonksiyonunu çağırıp lblErr içine gerekli yazıyı yazıyor. Bu örnek geliştirilebilir tabii. Misal olarak eğer doğru ve kullanılabilir bir e-posta adresi belirtilmemiş ise submit butonunun enabled değeri false olarak işaretlenebilir ve formun submit edilmesi engellenebilir.

Bu tür işlerin istemci tarafında çözülmesi hem performans hem de trafik açısından daha doğru oluyor.

Düzeltme: Bu yazıdaki RegEx kodu eski kaldı bu sebeple RegEx ile E-Posta uygunluk kontrolü için kod başlığıyla yazdığım yazıyı okumanızı tavsiye ederim. Merak etmeyin kısa tuttum ve kodu hemen görebilirsiniz orada.

Öyle işte.

Posted in: ASP.NET | Web Service | Ajax | Javascript

Tags: , , , , , , , , ,

Ajax ile FileUpload kullanılamıyor, nasıl dosya yüklenebilir?

January 6, 2009 at 9:33 AMoozturk

ASp.NET standart nesnelerinden FileUpload ne yazık ki Ajax olan sayfalarda çalışmıyor. Bunun sebebi bu nesnenin AsyncCallBack çalışma özelliği yok. Ajax sayfalarında dosya yüklemesi yapmanın bazı yolları var.

- Ajax ile çalışabilecek bileşenler kullanılabilir. Mesela FileUpload Ajax 1.2 gayet düzgün çalışan bedava bir bileşendir.

- Ajax olan sayfamızın içinde, istediğimiz yerde iframe ile bir aspx sayfası yerleştiririz. Bu yerleştirdiğimiz aspx sayfasının içine fileupload nesnemizi koyarız ve oradan çalıştırırız. Örnek kodu aşağıda veriyorum.

<iframe src="ImageUploader.aspx" id="ifrm" frameborder="0" scrolling="no" width="500px" height="200px"></iframe>

Ajax ile dosya yüklemenin başka yolları da var. Ancak çoğu durumda ikinci belirttiğim yol yeterli olacaktır.

Posted in: ASP.NET | Ajax

Tags: , , , ,

ASP.NET 3.5 ile Bound Control içindeki button'un OnClick ya da OnClientClick event'i esnasında "Invalid postback or callback argument" hatası neden alınır?

December 31, 2008 at 3:03 AMoozturk

Eğer html kodu doğru hazırlanmış ise büyük ihtimalle sebebi databind işleminin tam da bu işlem esnasında da çağırılıyor olmasındandır. Yani zaten tekrar doldurulmaya çalışılan databound nesne (gridview, datalist, vs...) içinde yer alan button'un event'i çağırıldığı için server artık aynı button nesnesine sahip olamamış oluyor. databind işleminin yalnızca doğru zamanlarda (Mesela: !Postback) çalışması sağlanınca sorun çözülmüş olacaktır.

Posted in: ASP.NET | Ajax | Javascript

Tags: , , , , , , , ,

Modalpopup penceresi neden flash nesnesinin altında kalıyor ya da flash nesnesi en üstte kalıyor? Nasıl engellenir?

December 23, 2008 at 11:04 PMoozturk

Normalde bu tür üstte ya da altta kalma durumları z-index değerinden kaynaklanır ve bazı nesneler runtime esnasında otomatik olarak sayfadaki en yüksek z-index değerinden daha yüksek bir değer alırlar ki en üstte kalıp her zaman görünür kalsınlar. Bu tür sorunları üstte kalmasını istediğimiz nesnenin z-index değerini daha yüksek vererek çözeriz.

 Ancak flash nesneleri için durum daha farklı, flash nesnelerini sayfalarına koyarken <object>, <param> ve <embed> taglarnı kullanırız. Bu taglar vasıtasıyla flash nesnesine parametreler gönderebilir ve bazı ayarlarını tanımlayabiliriz. Misal vermek gerekirse, dosya adı, genişlik, yükseklik gibi değerler tanımlanır ve scriptaccess gibi parametreler flash nesnesine verilebilir. Bu problemi flash nesnesine bir parametre gönderimi ve bir embed özelliği sayesinde çözebiliyoruz. Aşağıdaki iki eklemeyi yapalm:

1. Bir parametre satırı ekleyeceğiz.

     <param name="wmode" value="transparent" />

2. Bir de embed tagında bir özelliğe değer vereceğiz.

     wmode="transparent"

Bu şekilde büyük ihtimalle sorununuzu çözmüş olacaksınız. Bir de flash nesnesini bu şekilde eklediğimizde yazmamız gereken tam koda örnek veriyorum aşağıda.

<object width="870" height="370" style="z-index:0">

    <param name="movie" value="/flashdosyasi.swf" />

    <param name="allowscriptaccess" value="samedomain" />

    <param name="wmode" value="transparent" />

    <embed src="/flashdosyasi.swf" width="870" height="370" wmode="transparent">

    </embed>

</object>

 

İyi çalışmalar dilerim.

Posted in: ASP.NET | Ajax | Flash

Tags: , , , , , ,

Javascript ile hiddenfield değerini değiştirmek

December 23, 2008 at 1:46 PMoozturk

Javascript ile bir hiddenfield'in değerini değiştirmek istiyorsak; javascript ile öncelikle onu bulmamız daha sonra değerini değiştirmemiz gerekir. Bu yapmak esasen çok kolay gözükse de masterpage kullandığımız zamanlarda hiddenfield kontrol'ünün id'si değiştiği için onu bulmak güç olabilir.

 Aşağıdaki kod ile bu işi çözebiliriz.

   var hdn = document.getElementById(<% ="\'" + HiddenField1.ClientID + "\'" %>);

Şimdi de bir örnek ile hem ajax, hem masterpage'in kullanıldığı bir ortamda hiddenfield değerini değiştirip, kontrol edelim.

1. Yeni bir proje içine bir masterpage ve bu masterpage'i kullanan bir contentpage hazırlayalım.

2. Masterpage'imize; bir scriptmanager, bir updatepanel koyalım. Updatepanel içine de bir label (Label1),  bir html buton (Button1) son olarak da bir hiddenfield (HiddenField1) koyalım. Bir de head kısmına aşağıdaki kodu yazalım.

   function setz() {

        var hdn = document.getElementById(<% ="\'" + HiddenField1.ClientID + "\'" %>);

        if(hdn)

        {

           hdn.value = "deneme";

          __doPostBack(<% ="\'" + UpdatePanel1.ClientID + "\'" %>, '');

        }

   }

3. Masterpage'imizdeki Button1 kontrolümüzü tanımladığımız satıra aşağıdaki işaretli kısmı ekleyelim.

     <input id="Button1" type="button" value="button" onclick="return setz();" />

4. Masterpage'imizin kod sayfasında, form load içine de aşağıdaki kodu yazalım. 

     Label1.Text = HiddenField1.Value;

5. Contentpage'imiz boş kalsın.

Uygulamayı çalıştıralım. Düğmeye bastığımızda, label'in yazısının deneme diye değiştiğini göreceğiz. Bunu dinamik herhangi bir olay neticesinde yapabiliriz.

Bildiğiniz gibi bir html butonunun herhangi bir .net kodu ya da kendinden bir postback özelliği yoktur. Haliyle tamamen client tarafında değeri değiştirip daha sonra UpdatePanel ile postback yaptık ki o da zaten server tarafında sadece gerekli kısmın değişmesini sağlayıp, bütün sayfanın yenilenmesini engelliyor. Aslında ajax kullandığımız için javascript içinde kullandığımız _doPostBack komutu yerine aşağıdaki kodu da kullanabilirdik.

    <%= ClientScript.GetPostBackEventReference(HiddenField1, "") %>;

Ayrıca kodda bazı optimizasyonlar da yapılabilir. Misal olarak her seferinde hdn değerini eşitlemek yerine javascript genelinde bir değişken açıp oradan da tanımlayabilirdik mesela.

İyi çalışmalar dilerim.

Posted in: ASP.NET | Ajax | Javascript

Tags: , , , , ,

Flash ya da javascript ile sayfadaki ajaxtoolkit nesnelerini çalıştırmak

December 1, 2008 at 10:12 AMoozturk

Bir web sitesi hazırlıyorsunuz ve sayfanızda hem flash var hem de ajaxtoolkit nesneleri var.  Flash üzerindeki bir olay halinde - mesela bir butona basıldığnda - bu ajaxtoolkit nesnesine etki etmeniz gerekti, ne yapacağınızı bulmaya çalışıyorsunuz. Doğru yerdesiniz...

Öncelikle şu yazıyı bir okumanızı tavsiye ederim; Flash ile javascript fonksiyonu çalıştırmak.

Flash ile javascript'e ulaşabileceğimizi biliyoruz, demek ki diğer nesnelere de bu javascript ile ulaşabiliriz.

Hiç vakit kaybetmeden örnek ile anlatacağım.

- Bir Ajax enabled masterpage yaratın.

- Bu masterpage üzerinden bir ajax enabled web form yaratın.

- Bu web form'una updatepanel ekleyin ve içine bir modalpopupextender koyun.

- Bu modalpopupextender'a bazı değerler vereceğiz tanım satırında:

   * TargetControlID olarak bir buton falan verin, kullanmanıza gerek yok, onları saklayacağız az sonra.

   * PopupControlID olarak mesela bir panel verin ve panel içine btnCancel adı ile bir buton koyun.

   * CancelControlID olarak btnCancel yazın.

   * BehaviorID olarak da mesela pnlModalVisHid yazın.

- TargetControlID için verdiğimiz butonu kullanmayacaksak buton özelliklerinden visible=false sakın kullanmayın. Çünkü bu durumda IIS bu butonu render etmez ve istemciye yollamaz. Onun yerine div ile visible=false yapın.

- Şimdi bu işlemleri yaptığınız content page içine bir javascript yazalım.

   <script type="text/javascript">
     function showPanel() {
        var pnlvis = document.getElementById(<% ="\'" + pnlModalVisHid.ClientID + "\'" %>);
        pnlvis.show();
     }
   </script>

 

- Eğer flash ile kullanmak istiyorsak yukarıdaki javascript fonksiyonunu çağıracak işlemleri, yukarıda verdiğim yazıdaki gibi yapalım. Eğer javascript ile çalıştırmak istiyorduysanız zaten şu an da hazırlamış bulunuyorsunuz.

İşte oldu. Şu an da bu örneği IIS içine deploy ederseniz, çalıştığını göreceksiniz.

Umarım yeterince açık yazabilmişimdir. Sorularınız olursa bana e-posta atın, mümkün olan en kısa sürede cevap yazarım.

 

İyi çalışmalar dilerim.

Posted in: ASP.NET | Ajax | Flash | Javascript

Tags: , , , , , , , ,

ASP.NET sayfalarında Ajax kullanıldığında bozulan türkçe karakterlerin düzeltilmesi ne kadar zor olabilir ki?

July 28, 2008 at 11:27 AMoozturk

Merhaba,

Zaten çalışan bir web sitesini ajax ile çalışabilmesi için gerekli değişiklikleri yapıyordum, işi bitirdim dedim ve test etmeye başladım, yazı yazdığım yerler sayfada bir callback yapıldığında türkçe karakterlerin sorun çıkarttığını gördüm. Sorunu çözmek için response ve request encoding ayarlarının türkçeye ayarlanması gerekiyor. UTF ayarlarından kaynaklanıyor sanırım bu sorun.

Çözüm için aşağıdaki kodu system.web'in altına koydum ve sorunu çözdüm, tavsiye ederim.

<globalization

requestEncoding="utf-8"

responseEncoding="utf-8"

fileEncoding="Windows-1254"

responseHeaderEncoding="Windows-1254"

/>

Umarım yardımcı olabilmişimdir.

Posted in: ASP.NET | Ajax

Tags: , , ,