January 21st, 2009 — 12:07am
Visual Studio default olarak transitional doc type uyguluyor. Biraz daha geriye yönelik destek veren bir doc type bu…
!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN”
“http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”
Bir kaç durum asp.net‘i, xhtml‘i desteklemekten alıkoyuyor. Mesela AdRotator, TreeNode, HyperLink, HyperLinkColumn, BulletedList gibi kontroller “target” özelliğine sahip. Bu özelliklerini kullandığımızda bu kontroller uyumluluğumuzu bozulacak.
Ya da Table olarak render edilen her hangi bir kontrol gene bu uyumluluğumuzu bozacak. Mesela GridView Table olarak render ediliyor. Uyumluluk şartsa kullanmıycaz malesef…
Ayrıca asp.net‘in render ettiği kontrollere hem name hem de id verme huyu var. Bu geriye dönük bir destek amaçlı gene. xhtml’de de elemanlar id attribute’u alsın diye bir kural var.
<system.web>
….
<xhtmlConformance mode=”Strict“/>
….
</system.web>
Eğer yukardaki tanımlamayı web.config de yaparsak render edilen kontrollerin name attribute almadığını göreceğiz.
Ayrıca xhtml’i elinizle yazarken visual studio sizi uyarsın isterseniz. “HTML Source Editing” Araç çubuğundan xhtml tipinizi değiştirebilirsiniz.
Tabi xhtml uyumlu olmak kurumsal projelerde önemsiz bir ayrıntı şu an… ama yaptığımız şey web’e çıkacaksa bence olmazsa olmaz…
bir gün yazdığımız xhtml tüm browserlarda sorunsuz çalışacak ümidiyle…
Kaynaklar
aPress Pro Asp.Net 3.5 in c# 2008 kitabı
wikipedia
msdn
Comment » | Asp.Net
January 8th, 2009 — 11:33am
asp.net ile kodlanmış bir sayfamız var.
Uygulamayı deploy ettik ve anlam veremediğimiz bi şekilde çalışmıyor.
Hatta “mümkün değil, nasıl oluyo anlamıyorum?” gibi cümleler kurmaya da başladık.
işte bu noktada uygulamamız adım adım neler yapıyor görmek istiyoruz.
aaa oda ne hiç bişeyi loglamamışız! halbuki hep loglu çalışırız.
o anda asp.net trace mekanizması imdada yetişiyor.
basit bi şekilde her adımda neler dönmüş hangi adım kaç salise sürmüş görüyoruz…
önce web.config den aktif hale getirelim (sayfa bazında da yapılabilirdi…)
<trace enabled=”true” requestLimit=”20″ pageOutput=”false”
traceMode=”SortByTime” localOnly=”false” />
sonra /trace.axd yi çağırıyoruz….
mutlu son 2 dakika içinde sorununn nerden kaynaklandığını buluyoruz.
mutsuz son gerçekten anlamsız nerden kaynaklandığı belli olamayan bir bugla karşı karşıyayız… hayat bu olmaz olmaz…
kaynaklar
csharp nedir?
msdn
Comment » | Asp.Net
December 4th, 2008 — 10:21am
Before i learn MaintainScrollPositionOnPostBack property. I was creating a zero widthed, zero heighted and zero bordered textbox. Then call Focus() for that textbox to behave like page remembers the position :)
sounds funny but it works!
from today on i am using MaintainScrollPositionOnPostBack . to let asp.net to remember the scroll position.
/// <summary>
/// Use this class for base of all pages
/// </summary>
public class BasePage:Page
{
public BasePage()
{ }
protected override void OnInit(EventArgs e)
{
base.OnInit(e);
MaintainScrollPositionOnPostBack = true;
}
}
Comment » | Asp.Net
December 1st, 2008 — 10:46pm
Hepimiz uygulamalarımıza captcha controlü ekliyoruz. ama kullanıcılar direkt her sayfada karşılarına gelen bu kontrolden pek hoşnut değil.
Ekteki örnekte arka arkaya 5 response gerçekleşirse captcha gösteren bir uygulama var.
Sonucta arka arkaya gelen response bot olabilir ama tek gelen response kullanıcıdır.
Kullanıcıyı rahatsız etmemeyi hedeflemenizi öneririm.
Kodlar
public class SystemUser
{
public SystemUser()
{
FirstReqTime = DateTime.Now;
ReqCount = 1;
}
public DateTime FirstReqTime { get; set; }
public int ReqCount { get; set; }
private bool captcha;
public bool RequiersCapthca
{
get
{
if (ReqCount > 5)
{
TimeSpan ts = DateTime.Now - FirstReqTime;
if (ts.TotalSeconds > 5)
{
captcha = true;
}
else
{
captcha = false;
}
}
return captcha;
}
set { captcha = value; }
}
}
public class BasePage : Page
{
public BasePage()
{
//
// TODO: Add constructor logic here
//
}
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
SystemUser scu = Session["CaptchaControl"] as SystemUser;
if (scu == null)
{
scu = new SystemUser();
Session.Add("CaptchaControl", scu);
}
else
{
scu.ReqCount++;
}
if (scu.RequiersCapthca)
{
Session.Add("ShowCaptcha", true);
}
}
}
Comment » | Asp.Net
November 14th, 2008 — 5:25pm
Aşağıdaki kod dinamik olarak SqlDataSource ve GridView oluşturup sayfaya ekler.
AutoGenerateEditButton özelliği true olduğu için, GridView sayfaya eklendiğinde edit butonu görünür olur.
SqlDataSource’un UpdateCommand’ı verildiği için de Edit butonuna bastığınızda çalışır.
protected void Page_Load(object sender, EventArgs e)
{
SqlDataSource ds = new SqlDataSource();
ds.ConnectionString = “Data Source=.;Initial Catalog=DBName;
User ID=sa;Password=test”;
ds.SelectCommand = “SELECT [Field1], [Field2] FROM [tblTable]“;
ds.UpdateCommand = “UPDATE [tblTable] SET [Field2] = @Field2
WHERE [Field1] = @Field1″;
ds.UpdateParameters.Add(new Parameter(“@Field1″, DbType.Int32));
ds.UpdateParameters.Add(new Parameter(“@Field2″, DbType.String));
ds.ID = “dSource”;
GridView grd = new GridView();
grd.DataSourceID = ds.ID;
grd.AutoGenerateColumns = true;
grd.AutoGenerateEditButton = true;
form1.Controls.Add(ds);
form1.Controls.Add(grd);
grd.DataBind();
}
Comment » | Asp.Net
May 2nd, 2008 — 8:49pm
Askerliğimi; KİEM (Kamu İnternet eğitim merkezi) sorumlusu olarak ve erlere bilgisayar öğreterek geçirdim. Bilgisayar nedir? Nasıl çalışır? Gibi temel soruların cevaplarını öğrettim diyebilirim.
Eğitim sonunda askerlere birde seviye tespit sınavı yapıyorduk. Her 2 hafta da bir 120 askere sınav yapıp onların kağıtlarını okumak ve o kağıtlara notlar verip birde o notları excel tablosunda raporumsulamak gerekiyordu.
Bir programcı olarak durumdan kendime vazife çıkardım ve intranetten askerlere bir sınav hazırladım. Herkes oturduğu yerden 5 dakikada sınav oluyordu. Ve anında kaç aldığını öğreniyordu. Ben anında herkesin sonuçlarını görüyordum ve excel’e kaydediyordum. Excel’de de bir pivottable ile işimi bitiriyordum.
Yurdum insanı çakal olduğu için kopya çekmesin diye de her öğrenciye veritabanından rasgele çoktan seçmeli 5 soru geliyordu.
Sınav sorularının tam olarak bilgiyi ölçmesinin arkasında değilim. Çok iyi sorular değil ama içinde bulunduğum koşullar içinde son derece yeterli olduğunu söyleyebilirim :)
Sınav sistemini asp.net ile Visual Studio 2008 de hazırladım.
Benzer bir durumda askerliğini KİEM sorumlusu olarak yapacak arkadaşlara armağanımdır. :)
Visual Studio 2008 ile Hazırlandı
Kodları İndirmek İçin Tıklayınız
private void SorulariOlustur()
{
try
{
ScriptManager sm = new ScriptManager();
sm.ID = "sm1";
Page.Form.Controls.Add(sm);
UpdatePanel up1 = new UpdatePanel();
up1.ID = "UpdatePanel1";
up1.UpdateMode = UpdatePanelUpdateMode.Conditional;
Session.Add("Not", 0);
Soru[] _Sorular = new Soru[5];
try
{
_Sorular = (Soru[])Session["SorularNesnesi"];
}
catch (Exception ex)
{
try
{
Session.Remove("Hata");
}
catch (Exception)
{
}
finally
{
Session.Add("Hata", ex.Message);
Response.Redirect("Hata.aspx", false);
}
}
Literal ltr;
Random rnd = new Random();
for (int i = 0; i < _Sorular.Length; i++)
{
ltr = new Literal();
ltr.ID = "ltr" + i.ToString();
ltr.Text = "<br/><b>Soru " + Convert.ToString(i + 1) + " : </b>"
+ _Sorular[i].SoruMetni + "<br/><br/>";
up1.ContentTemplateContainer.Controls.Add(ltr);
if (_Sorular[i].IsCoktanSecmeli)
{
RadioButtonList rbl = new RadioButtonList();
rbl.ID = "rbl" + i.ToString();
//Şıkları Karıştıma Kısmısı
ArrayList _cevaplar = new ArrayList();
int _uzunluk = _Sorular[i].Cevaplar.Length;
int _taban = 0;
for (int j = 0; j < _uzunluk; j++)
{
_cevaplar.Add(_Sorular[i].Cevaplar[j]);
}
Session.Add(rbl.ID, _Sorular[i].DogruCevap);
int _sayi = rnd.Next(_taban, _uzunluk);
ArrayList _rasgeleSayilar = new ArrayList();
ArrayList _yeniArray = new ArrayList();
for (int k = 0; k < _cevaplar.Count; k++)
{
_yeniArray.Add(_cevaplar[_sayi].ToString());
_rasgeleSayilar.Add(_sayi);
do
{
if (_yeniArray.Count != _cevaplar.Count)
{
if (_sayi == _taban)
{
_taban++;
}
if (_sayi == _uzunluk - 1)
{
_uzunluk--;
}
_sayi = rnd.Next(_taban, _uzunluk);
}
else
{
break;
}
}
while (_rasgeleSayilar.Contains(_sayi));
}
for (int l = 0; l < _yeniArray.Count; l++)
{
rbl.Items.Add(_yeniArray[l].ToString());
}
/////////////////////////////////////////////////
up1.ContentTemplateContainer.Controls.Add(rbl);
}
else
{
TextBox txt = new TextBox();
txt.ID = "txt" + i.ToString();
txt.TextMode = TextBoxMode.MultiLine;
txt.Width = 250;
txt.Height = 60;
Session.Add(txt.ID, _Sorular[i].DogruCevap);
up1.ContentTemplateContainer.Controls.Add(txt);
}
ltr = new Literal();
ltr.ID = "ltr2" + i.ToString();
ltr.Text = "<br/><br/>";
up1.ContentTemplateContainer.Controls.Add(ltr);
}
Button button1 = new Button();
button1.ID = "Button1";
button1.Text = "Sınavı Bitir";
button1.Click += new EventHandler(Button_Click);
ConfirmButtonExtender cbe = new ConfirmButtonExtender();
cbe.ID = "cbe1";
cbe.ConfirmText = "Sınavı Bitirmek İstediğine Emin Misin?";
cbe.TargetControlID = "Button1";
Page.Form.Controls.Add(cbe);
Page.Form.Controls.Add(up1);
Page.Form.Controls.Add(button1);
}
catch (Exception ex)
{
try
{
Session.Remove("Hata");
}
catch (Exception)
{
}
finally
{
Session.Add("Hata", ex.Message);
Response.Redirect("Hata.aspx", false);
}
}
}
7 comments » | Asp.Net