12 Temmuz 2013 Cuma

ajax texbox sayı sınırı harf sınırı ve virgül nokta sınırı

ajax texbox sayı sınırı harf sınırı ve virgül nokta sınırı

http://www.asp.net/ajaxLibrary/AjaxControlToolkitSampleSite/FilteredTextBox/FilteredTextBox.aspx

ajax validation popup

ajax validation popup

http://www.asp.net/ajaxLibrary/AjaxControlToolkitSampleSite/ValidatorCallout/ValidatorCallout.aspx

Custom Handler ile resim çağırmak (asp.net)

Custom Handler ile resim çağırmak (asp.net)

Konu başlıkları

 [gizle]

Motivasyon

http://forum.ceviz.net/showthread.php?t=61515 adresindeki konuya cevap olarak eklenmiştir.

Versiyon

Burada verilen örnek kodlar asp.net 2.0 ve üzerinde çalışabilir. Eski versiyonlarda da handler desteği vardır. Ancak sonuca hızlı ulaşmak adına anlatımı ihmal edilmiştir.

Ön bilgi

Amacımız, bir resim dosyasını çağırmayı nasıl bir .net sınıfına bağlayacağımızı basit bir şekilde göstermektir. Bunu bir custom handler kullanarak yapacağız. Bu örneği inceleyen kişi, kolayca örneği geliştirip resim çağrılırken sayaç işletme vs. kodlarını da içine ekleyebilir.

Örnek kullanım

Bu kod ile App_Data içinde bulunan /urun_resim klasörünüzden herhangi bir resmi çekmeniz için, örneğin
<img src="resim.axd?resim=resim.jpg"/>
Şeklinde çağırabilirsiniz. Resmin bulunamaması durumunda App_Data/urun_resim klasöründe blank100x100.jpg isminde bembeyaz bir resmin bulunduğunu da bu örnekte varsayıyoruz. Herhangi bir hata durumunda bu boş resim dosyası yanıt olarak dönecektir.

Kodlar

web.config dosyasınra yapılması gereken değişiklik:
<configuration>
  <system.web>
    <httpHandlers>
      <add verb="*" path="resim.axd" type="ornek_isimalani.ResimHandler" validate="false"/>
    </httpHandlers>
  </system.web>
</configuration>
App_Code klasörünün içinde oluşturacağımız herhangi bir .cs uzantılı dosya içinde, (örneğin ben ismini resim.cs yaptığımızı varsayacağım) resim.cs :
/*
 * SharpDevelop Tarafından Oluşturulmuşdur.
 * Kullanıcı: anov
 * Tarih: 08.07.2008
 * Zaman: 14:46
 * 
 * Bu şablonu değiştirmek için Araçlar | Seçenekler | Kodlama | Standart Başlıkları Düzenle 'yi kullanın.
 */
 
using System;
using System.Drawing;
using System.Web;
 
namespace ornek_isimalani
{
 /// <summary>
 /// Description of UrunResimHandler.
 /// </summary>
 public class ResimHandler : IHttpHandler
 {
  public ResimHandler()
  {
  }
 
  public bool IsReusable {
   get {
    return true;
   }
  }
 
  public void ProcessRequest(HttpContext context)
  {
   if(context.Request.QueryString["resim"]==null) return;
   string resim= context.Request.QueryString["resim"];
   //---
   context.Response.ContentType = "image/jpeg";
   context.Response.Clear();
   Image i = null;
   try
   {
    i = Image.FromFile(context.Server.MapPath("App_Data/urun_resim/"+ resim));
   }
   catch
   {
 
    i = Image.FromFile(context.Server.MapPath("App_Data/urun_resim/blank100x100.jpg"));
 
   }
   finally
   {
    i.Save(context.Response.OutputStream, System.Drawing.Imaging.ImageFormat.Jpeg);
   }
   //hata durumunda boş resim döndürelim.
  }
 }
}

Sorular

Sorularınız için bu maddenin "Tartışma" sayfasını kullanıp "+" işaretiyle yeni mesaj oluşturabilirsiniz. Teşekkürler.

Resim boyutlandırma örneği (asp.net)

Resim boyutlandırma örneği (asp.net)


http://forum.ceviz.net/showthread.php?t=50585
 Konusuna cevap olarak yazılmıştır.Motivasyon

Amaç

.net framework içinde bulunan hazır kütüphanelerle resmi daha küçük boyutlara getirmek (thumbnail) işlemini yapmaktır.

Gereksinimler

Graphics sınıfının DrawImage metodunun hedefini kurmak için 100x100 boyutlarında "blank.jpg" isimli boş bir jpeg resmi. Buraya yapıştırılan kod, Windows XP Service Pack 2 kurulu bir bilgisayarda .net framework 2.0 ve IIS ile test edilmiştir.

Kod

Aspx kodu : (resim_boyutlandir.aspx)
<%@ Page
 Language           = "C#"
 AutoEventWireup    = "false"
 Inherits           = "dotnet.resim_boyutlandir"
 ValidateRequest    = "false"
 EnableSessionState = "false"
%>
 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
 <head>
  <title>Resmi herhangi bir bileşen kullanmadan boyutlandır.</title>
 
  <meta http-equiv="content-type" content="text/html; charset=utf-8" />
  <meta http-equiv="CACHE-CONTROL" content="NO-CACHE" />
  <meta http-equiv="PRAGMA" content="NO-CACHE" />
 
 </head>
 <body>
  <form id="Form_resim_boyutlandir" method="post" runat="server">
   <asp:FileUpload ID="fileuploadResim" runat="server"/>
   <asp:Button ID="buttonGonder" runat="server" Text="Gönder"/>
  </form>
 </body>
</html>
C# kodu : (resim_boyutlandir.aspx.cs)
/*
 * Created by SharpDevelop.
 * User: anov
 * Date: 17.05.2008
 * Time: 11:54
 * 
 * To change this template use Tools | Options | Coding | Edit Standard Headers.
 */
 
using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Drawing.Drawing2D; //önemlidir.
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
 
namespace dotnet
{
 /// <summary>
 /// Description of resim_boyutlandir
 /// </summary>
 public class resim_boyutlandir : Page
 { 
  //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  #region Data
  protected FileUpload fileuploadResim;
  protected Button buttonGonder;
  #endregion
  //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  #region Initialize Component
 
  protected override void OnInit(EventArgs e)
  { InitializeComponent();
   base.OnInit(e);
  }
  //----------------------------------------------------------------------
  private void InitializeComponent()
  { 
   //------------------------------------------------------------------
   buttonGonder.Click += new EventHandler(buttonGonder_Click);
   //------------------------------------------------------------------
  }
  #endregion
  //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  #region button_Click
  private void buttonGonder_Click(object sender, EventArgs e)
  {
   if(fileuploadResim.HasFile)
   {
    System.Drawing.Image i = System.Drawing.Image.FromStream(fileuploadResim.PostedFile.InputStream);
    //Not: blank.jpg 100x100 boyutunda bembeyaz bir resim dosyasıdır.
    System.Drawing.Image hedef = System.Drawing.Image.FromFile(Server.MapPath("resim/blank.jpg"));
    Graphics g = Graphics.FromImage(hedef);
    g.InterpolationMode = InterpolationMode.Bilinear; //Resim küçüldüğünde oluşan (flicker)
    //g.SmoothingMode da kullanılabilir burada.
    g.DrawImage(i, new Rectangle(0,0,100,100));
    Response.Clear(); //Ekrana sadece resmi yazdıracağız.
    Response.ContentType = "image/jpeg";
    hedef.Save(Response.OutputStream, System.Drawing.Imaging.ImageFormat.Jpeg);
    Response.End();
   }
  }
  #endregion
  //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
 }
}

MSSQL Membership

MSSQL Membership

Standart Bir Mssql Membership Nasil Olusturulur

Öncelikle: New > Project > Asp.net Web Application Diyerek standart bir asp.net uygulaması oluşturalım. Bu proje şimdilik dursun gelelim mssql tarafına. Microsoft SQL Server Management Studio Express’i açalım.
SQL Server Management Studio Express Giriş Ekranı
Connect diyerek localdeki Sql Servera bağlanalım. Bağlandıktan sonra Databases > New Database yolunu takip edelim.
SQL Server Management Studio Express ile Veritabanı oluşturma
İsmini Mssql_Membership olarak verdim. Şimdide membership için gerekli tabloları oluşturalım.
1. C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727 yoluna gidip aspnet_regsql.exe uygulamasını çalıştırın. Çıkan ekrandan ilk pencereyi next diyerek geçin. Sonraki ekranda Configure Sql Server for application services ı seçip ileri deyin. Şimdi karşınıza aşağıdaki ekran çıkacak.
aspnet_regsql kullanarak membership tablolarını otomatik oluşturma-1 (C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet_regsql.exe
Burdaki olay şu. Bu membership tabloları hangi veritabanında oluşturulacak. Bir makinada birden fazla instance olabileceğinden Mousty\SqlExpress kısmı da değişebilir. Ama Database kısmında biraz önce yarattığımız veritabını görüyorsak tamamdır. Next diyelim. Burda yapılacak değişikliklerle ilgili bilgiler veriyor. Next deyip The database has been created or modified yazısını görmüşseniz veritabanında ilgili tablolar oluşturulmuştur anlamına gelir. Finish deyip buradaki olayımızı bitirelim. Veritabanımıza geri döndüğümüzde şöyle bir şey çıkıyor karşımıza…
aspnet_regsql ile oluşturulan tabloların görünümü (C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet_regsql.exe)
Veritabanıyla işimiz bu kadardı. Şimdi Visual Studioya dönelim.
Web.config dosyamızı açalım ve değişikliklerimizi yapalım.
<connectionStrings/>
Kısmını
<connectionStrings>
<add name="Mssql_MembershipConnectionString" connectionString="Data Source=MOUSTY\SQLEXPRESS;Initial Catalog=Mssql_Membership;Integrated Security=True" providerName="System.Data.SqlClient" />
</connectionStrings>
Şeklinde değiştirelim. Tabiki burda Data Source=MOUSTY\SQLEXPRESS ve Catalog=Mssql_Membership alanlarını kendinize göre değiştireceksiniz. Eğer connection ayarlarını nasıl yapacağınızı bilmiyorsanız http://www.connectionstrings.com dan bakabilirsiniz. Şimdide:
<authentication mode="Windows" />
Kısmını
<authentication mode="Forms">
        <forms loginUrl="~/login.aspx" defaultUrl="~/panel/default.aspx"/>      
</authentication>
Şeklinde değiştirin. loginUrl eğer kullanıcı kısıtlı bölgelere erişmek ister ve giriş yapmamış ise login.aspx sayfasına yönlendirilecek. Ve login olduktan sonrada ~/panel/default.aspx sayfasına yönlendirilecek. Şimdide membership düğümünü ayarlayacağız.
<membership defaultProvider="BizimProvider">
        <providers>
          <clear/>
          <add name="BizimProvider" 
               type="System.Web.Security.SqlMembershipProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
               connectionStringName="Mssql_MembershipConnectionString" 
               enablePasswordRetrieval="false" 
               enablePasswordReset="true" 
               requiresQuestionAndAnswer="false" 
               requiresUniqueEmail="true" 
               passwordFormat="Hashed" 
               maxInvalidPasswordAttempts="5" 
               minRequiredPasswordLength="6" 
               minRequiredNonalphanumericCharacters="0" 
               passwordAttemptWindow="10" 
               passwordStrengthRegularExpression="" 
               applicationName="/"/>
        </providers>
      </membership>
Providers kısmını öncelikle clear dedik. Çünkü başka bir ön tanımlı membership kullanmaya kalkmasın sistemimiz. Şimdi burdaki değerler ne anlam ifade ediyor kısaca onlara bakalım.
Name: Bizim kendimizin tanımladığı aynı zamanda membership düğümünde hangi providerı kullanacağına işaret eden isim. Membership düğümünün altında 1den fazla provider tanımlı olabilirdi. O yüzden hangisini kullanacağını isimden ayırt ediyor.
Type: Providerımızın kullanacağı membership yapısının tanımlı olduğu isim uzayı + sınıf (namespace + class). Kendi membership sistemimizi yazmış olsaydık o zaman kendi sınıfımızın isim uzayını ve ismini yazacaktık buraya. Burdaki standart membership olduğundan uzunca bir tanımlaması var.
connectionStringName: Bu provider hangi veritabanını kullanacağı burda belirtiliyor. ConnectionStrings düğümünde belirttiğimiz bağlantı isimlerinden birini yazın.
enablePasswordRetrieval: Kullanıcıya şifresini gerialma yetkisi vermek istermisiniz o zaman ayarı budur.
enablePasswordReset: Kullanıcı şifresini unuttuğunda şifresini sıfırlayabilsin mi?
requiresQuestionAndAnswer: Kullanıcı kayıt olurken Güvenlik Sorusu ve Cevabı aktif olsun mu
requiresUniqueEmail: Her kullanıcı sadece tek email adresi ile mi ilişkilendirilsin. Eğer false ise birden fazla kullanıcı aynı email adresi ile sisteme kayıt olabilir.
passwordFormat: Kullanıcı şifrelerinin veritabanında nasıl saklanılacağı. Opsiyonları:
•Clear: Şifreler direk veritabanına olduğu gibi kayıt edilir.
•Encrypted: Şifreler şifrelenerek veritabanına kaydedilir ve daha sonra kullanıcıya okunur bir şekilde gösterilebilir. (Çift Yönlü Dönüşüm Yapılabilir.)
•Hashed: Şifreler şifrelenir. Fakat kullanıcıya da daha sonradan gösterilemez. (Tek Yönlü Dönüşüm Yapılır)
Ben genelde encrypted kullanırım. Olur ya ileride göstermek isterim şifresini diye… Ama passwordFormat kısmını Encrypted olarak ayarlar iseniz ekstra bir şey daha yapmamız gerek. Oda web.config dosyamız içine <system.web>..</system.web> içinde herhangi bi yere şunu eklemeniz gerekir.
<machineKey validationKey="EECA48CD7D7DEF9E652E7F9451AE8D76D67EB3E7E43766D12318CBA64C58A761D6E68AA58E7EB149ECAB9FF915BF07615FA682F501285FC361DA8B72C527FF6C"
decryptionKey="4F8E8E4F236A3B24DE50D6BBB393E9911A1F2428AF23C82B" validation="3DES"/>
Ya buda nedir dediğinizi duyar gibiyim. Şimdi Encrypted türü şifrelemede kullanıcı şifresinin geri döndürülebilmesi için bir tane sabit keyimiz olmalı ki kullanıcı oluşturulurken veritabanına kaydedilecek şifre bu key baz alınarak oluşturulsun. Ve aynı şekilde geri döndürülebilsin. Bu machineKey düğümünü nasıl oluştururum kendim diye sorarsanız nette arayın machineKey creator diye çıkar karşınıza. Aradığımda çıkan 2. Sonuç benim istediğimi yapıyor. Adres: http://aspnetresources.com/tools/keycreator.aspx
Eğer şifreleme metodunuz Encrypted ise ve machineKey tanımlamamışsanız şöyle bir hata alırsınız.
You must specify a non-autogenerated machine key to store passwords in the encrypted format. Either specify a different passwordFormat, or change the machineKey configuration to use a non-autogenerated decryption key.
maxInvalidPasswordAttempts: maksimum yanlış şifre girilme sayısı. Eğer kullanıcı burdaki değerden fazla sayıda yanlış şifre girmişse hesabı kitlenir ve bundan sonra şifresini doğru girsede siz kilidi kaldırıncaya kadar da sisteme giriş yapamaz.

minRequiredPasswordLength: Gerekli minimum şifre uzunluğu. (Kayıt olurkenki)
minRequiredNonalphanumericCharacters: Gerekli minimum alfa-numeric karakter sayısı.
passwordStrengthRegularExpression: Burda kullanıcının girmesi gereken şifre tarzını regular expression ile belirtebilirsiniz. Mesela şifre şu kadar uzunlukta ve bir harf bir rakam şeklinde girsin gibi. (Hiç kullanmadım burasını)
applicationName: Bu membership uygulamamızın adı. Ee daha önce tanımladık bu ne şimdi derseniz eğer şöyle söyleyeyim. Bir mssql veritabanı aldınız diyelim. Ve 3 tane 5 tane membership li sitenizi tek veritabanında fakat farklı kullanıcı ve rolleri olacak şekilde kullanmak istiyorsanız ayar burasıdır. Her uygulamaya farklı isim verirseniz istediğiniz olacaktır.
Şimdide RoleProvider ayarlarını yapalım web.config dosyasından
<roleManager enabled="true" defaultProvider="BenimRoleProviderim">
        <providers>
          <clear/>
          <add name="BenimRoleProviderim" type="System.Web.Security.SqlRoleProvider" connectionStringName="Mssql_MembershipConnectionString" applicationName="/"/>
        </providers>
</roleManager>
RoleProvider ne işe yarar der iseniz. Diyelimki kullanıcıları rollere atamak istiyorsunuz Mesela: adminusereditor vs. Bunların herbiri farklı klasörlere giriş yapması gerekir ise rollere göre ayrım yaptırabilirsiniz. Diyelim ki ~/Panel/ klasörüne sadece admin ler girebilir. Fakat ~/Editor klasörüne hem editor olarak tanımladığınız kişiler hemde admin ler giriş yapabilsin diye isteyebilirsiniz. Düğümde açıklanacak pek bişey yok membership düğümündekiler le aynı mantıkta.
Mssql Membership için oluşturduğumuz Projenin dosya yapısı
Şimdi solution explorer da görüldüğü üzere panel diye bir klasörümüz var içinde de default.aspx ve web.config dosyası var.Bu web.config dosyasında bu kısma kimlerin ulaşıp ulaşamayacağına karar vericez. Direk root taki web.config dosyasına da yazılabilirdi. Ama burda tercih ettim ben. Ve ayrıca ana dizinde login.aspx dosyasını oluşturdum. Şimdilik içleri boş bişey yapılmadı daha. İlk önce kendimize 2 tane rol 2 tane kullanıcı oluşturalım. ASP.NET Configuration’a tıklayıp açalım hazır kullanıcı oluşturma panelini (Şekilde de işaretli olan kısım).
Asp.net Website Administration Tool Ekran Görüntüsü
Karşımıza bu ekranın çıkması lazım. Burda Existing users: 0 yazısını görüyorsanız bir problem yoktur sisteminizde. Security linkine tıklayalım.
Asp.net Web Administration Tool Yardımı ile oluşturulmuş kullanıcı ve rol ekranı
Öncelikle Create or Manage Roles diyerek kendimize Admin ve User adında 2 tane rol tanımlayalım. Bundan sonra da Create user diyerek 2 tanede kullanıcı oluşturalım. Ben mustafa dedim ve rolünü Admin olarak belirledim testuser dedim rolünü User olarak seçtim. Artık elimizde 2 tane farklı role tanımlanmış 2 kullanıcı mevcut. ASP.NET Configuration sayfasını kapatabiliriz artık.
Şimdi panel klasörü içindeki web.config dosyasını açalım ve içeriğini şu şekilde değiştirelim.
<?xml version="1.0"?>
<configuration>
    <system.web>
        <authorization>
            <allow roles="Admin" />
            <deny roles="User" />
<deny users="?" />
            <deny users="*" />
        </authorization>
    </system.web>
</configuration>
Bu dizine erişim yetkilerini allow veya deny diyerek belirtiyoruz. Eğer rol bazlı yetkilendirme yapacaksak
<allow roles="Admin, User" />
<deny roles="Admin, User" />
Şeklinde kullanabiliriz. Ama kullanıcı bazlı yapacaksak.
<allow users="testuser, mustafa"/>
<deny users="testuser, mustafa"/>
Şeklinde erişim yetkilerini belirleyebiliriz. ? işareti login olmayan anonymous kullanıcıları temsil eder. Bizim ilk yaptığımız yetkilendirmede panel klasörüne admin rolündekiler erişebiliyor ama user rolündekiler ve login olmayanlar erişemiyor. Hemen test edelim bakalım…
Şimdi direk panel içindeki default.aspx e gitmek isterseniz sistem sizin login olmanız için şöyle bir adrese yönlendiriyor olması lazım:
http://localhost:3463/login.aspx?ReturnUrl=%2fpanel%2fdefault.aspx
burdaki login.aspx sayfasını web.config dosyasındaki authentication düğümündeki loginUrl ile tanımlamıştık hatırlıyorsanız. Şimdi gelelim Login sayfasını yapmaya… Login sayfamız boş idi. Şimdi sayfamıza bir adet Toolbox> Login > Login kontrolü sürükleyelim. Sayfayı kaydedin ve tekrar panel klasöründeki default.aspx sayfasına girmeye çalışın. Sizi login sayfasına yönlendirecek tekrardan.
Mssql Membership Basit Bir Login Ekranı
Sayfanın son hali şu şekilde olmalı. Kullanıcı adı ve şifremi demin tanımladıklarımdan admin olanınınkilerini giriyorum.
Mssql Membership Basit Bir Admin Paneli
Eğer şifremizi yanlış girmemişseniz görüntüsü yukarıdaki gibi olmalı sayfanızın. Adrese bakarsanız panel içindeki default.aspx olduğunu görürsünüz. Yalnız bide user rolü ile deniyelim. Ama bunun için öncelikle kullanıcının çıkış yapması gerekir. Bunuda gene Toolbox > Login > Login Status kontrolünü yerleştirin. Bu kontrol ne yapar derseniz; kullanıcı eğer giriş yapmış ise çıkış yap(logout), eğer zaten giriş yapmamış veya çıkış yapmış ise giriş yap (login) sayfalarına bağlantıları otomatik oluşturur.
Mssql Membership Basit Bir Admin Paneli - Login Status eklenmiş hali
Sayfama yerleştirdim kontrolümü ve giriş yapmış olduğum için bana Logout (Çıkış Yap) yazısını gösterdi. Eğer Logout yazısını değiştirmek isterseniz “Properties” panelindeki ayarları ile oynayabilirsiniz. Logout a tıkladığımda beni login sayfasına yönlendirecek çıkış işlemi gerçekleştirdiği için.
Şimdide login ekranında testuser kullanıcı ile giriş yapalım. Bu kullanıcıyı User rolüne atamıştık. Bu klasöre yetkisi olmadığı için kullanıcının şifresi doğru bile olsa sürekli login.aspx sayfasına yönderilmesi yapılır gerekli yetkideki bir kullanıcı ile giriş yapması için.
Son olarakta beni hatırla olayının testini yapalım. Tekrar login sayfasına girelim. Öncelikle Login kontrolümüzü seçip Properties penceresindeki RememberMeSet değerini true olarak değiştirin. Admin rolündeki mustafa kullanıcını ve şifresini girelim ve beni hatırlayı(Remember me next time) aktif edelim. Panele giriş yaptıktan sonra http://localhost:3463/panel/default.aspx adresini kopyalayıp browserı kapatın. Browserı açın ve adresi yapıştırın. Göreceksiniz ki direk panele giriş yapmışsınız.
Login kontrolü Properties panelindeki ayarlarında bir sürü değiştirilebilecek ayar var. Bunları inceleyin ve sindirin iyice.
Şimdi sıra yeni kullanıcı kaydında. Ana dizine bir tane register.aspx dosyası oluşturalım. İçine de Toolbox > Login > Create User Wizard kontrolü yerleştirin. Bu sayfayı View In Browser diyerek bir görüntüleyin bakalım.
Mssql Membership Basit Bir Kullanıcı Kayıt Formu
Sayfamız bu şekilde görünmesi gerekiyor. Burdaki yazıları türkçeleştirmek isterseniz eğer kontrolü seçip Properties penceresindeki ayarları ile oynayacaksınız. Eğer dikkat ederseniz tasarım zamanında görünen Security Question ve Security Answer alanları sayfada görünmüyor. Nedeni ise web.configteki membership düğümünde bulunan requiresQuestionAndAnswer değerini false olarak ayarlamamız. Eğer true yaparsak kullanıcı güvenlik sorusu ve cevabıda yazmak zorunda olacak. CreateUserWizard kontrolünün bir dünya özelliği var artık bol bol pratik yapacaksınız Propertiespenceresi ile. Fırsatım olursa ileride değinmeye çalışırım. Fakat önemli bikaç özelliğini de yazayım buraya hemencecik.
LoginCreatedUser: true/false – Kullanıcı oluşturulduğu an login olmuş sayılsın mı?

MailDefinition: Kullanıcı oluşturulduğu anda mail gönderilmesi için burdan ayar yapmalısınız.

Alt Özellikleri

BodyFileName: Şablon olarak kullanılacak txt veya html dosyasının adresi.
EmbeddedObject: Mail ile göndermek istediğiniz ilgili dosyaları burdan ekleyin.
IsBodyHtml: Eğer oluşturduğunuz mail şablonunun içeriği html ise true yapın.

Ve son bir not BodyFileName yani mail şablonu içinde şu şekilde kullanabilirsiniz.

Mail Şablon İçeriği
Merhaba <%UserName%>,
 
Sitemize üye olduğunuz için teşekkür ederiz. Giriş Yapmak için kullanacağınız şifreniz: <b><%Password%></b>’dür
 
Güvenlik Sorunuz: <%PasswordQuestion%>  
Cevabı:   <%PasswordAnswer%> ‘dır
Gibi kullanabilirsiniz. Genel itibari ile Mssql membership oluşturulması ve kullanımı bu şekilde olmaktadır. İleriki zamanlarda Kendi membership ve role providerlarımızla devam ederiz diye umuyorum.

Katkıda Bulunanlar

writeLine (Mustafa GÜLMEZ)

4 Temmuz 2013 Perşembe

Nested Master Page Nedir? Nasıl kullanılır? Ne zaman tercih edilmelidir?

Nested Master Pages

Nested Master Page Nedir? Nasıl kullanılır? Ne zaman tercih edilmelidir? Nested Master Page Kullanımına bir örnek...



        Nested Master Page leri, master page lerin iç içe ya da master-child şeklinde kullanılması şeklinde tanımlamak mümkündür.
       
        Peki gerekli bir şey midir? Evet bazen gerçekten çok gerekli bir şey oluyor. Özellikle, birden çok sayfanın aynı banner'i ve farklı menüleri kullanması söz konusu olduğunda nested master pageleri kullanmak çok büyük bir avantaj sağlıyor. Yazılım geliştirmek söz konusu olduğunda, tabii ki her zaman tek bir yol yoktur. Ama nested master page ler en iyi ve en pratik çözümü bize sağlamakta.

        Peni nasıl kullanacağız? Bunun için bir senaryo geliştirelim:
       
        Senaryomuza göre, web sitemizin sol tarafında sabit kalacak bir menüsü, bir banner kısmı ve bir de footer kısmı olsun. Menüde [Haberler] ve [Oyunlar] maddeleri olsun. Haberler tıklandığında, sayfamızın orta kısmına yüklenecek bir [Haberler Ana Sayfası]'nın üst tarafında, yatay bir menüde [Haberler Alt Menü] maddeleri yer alsın.(Ekonomi, Spor, Güncel, Popüler vs.) Bu yatay menüden seçim yapıldığında ise, sayfamızın orta kısmına o alt menü ile ilgili sayfa yüklensin (Ekonomi seçildiğinde ekonomi.aspx, spor seçildiğinde spor.aspx gibi.). Bütün bu anlattıklarımız aşağıdaki resimde gösterilmiştir.
        
Nested Master Page Örnek 1

Nested Master Page Örnek 2

        Bu örneklerde de görüldüğü gibi bir uygulama geliştirmek için aşağıdaki adımları takip edin. Resimdeki gibi bir tasarımı elde etmek için aşağıda yer alan kodları kopyalyıp yapıştırabilirsiniz.

        main.master
  1. Öncelikle, ekranda görülen BANNER ve sol tarafta yer alan ANA MENÜ kısımlarını ve ortadaki mavi renkteki içerik(content) kısmını içinde barındıran bir "main.master" master page ini hazırlıyoruz.
    <%@ MasterLanguage="C#"AutoEventWireup="true"CodeBehind="main.master.cs"  Inherits="NestedMasterPages_SampleSite.main"%>

    <!DOCTYPE html PUBLIC "-//W3C//DTDXHTML 1.0 Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        <title>Nested Master Page - Sample Site</title>
        <asp:ContentPlaceHolderID="head"runat="server">
        </asp:ContentPlaceHolder>
    </head>
    <body>
        <form id="form1" runat="server">
        <center>
            <div style="width:100%; text-align:center">
                <div style="width:1024px; height:auto">
                   <divstyle="width:1024px; height:89px; font-family:Times New Roman; font-size:24pt; font-weight:bold; color:White; background-color:#444;text-align:center">
                            BANNER - Sample Site
                   </div>
                   <div style="width:250px; height:auto; min-height:350px;background-color:WhiteSmoke; color:#444; float:left; text-align:left; border-left:3px solid Silver; padding:8px">
                       Ana Menü Burada
                       <br/>
                       <br/>
                       <a href="haberlerMain.aspx"target="_self">Haberler</a>
                       <br/>
                       <a href="oyunlarMain.aspx"target="_self">Oyunlar</a>
                   </div>
                   <divstyle="width:750px; height:auto; min-height:350px;background-color:LightSkyBlue;color:#444; float:right">
                       
                            <asp:ContentPlaceHolder ID="ContentPlaceHolder1"runat="server">
                                İçerik Buraya Yüklenecek...
                            </asp:ContentPlaceHolder>
                   </div>
                       
                </div>
            </div>
        </center>
        </form>
    </body>
    </html>
      haberler.master
  2. Şimdi [Haberler] nested master page ini  hazırlamaya geldi sıra. Bunun için projemizin [solution explorer] penceresinden projemizin adını seçip sağ clik yaptığımızda açılan menüden [add new item] düğmesini tıklayalım ve açılan pencereden [nested master page] seçelim. Nested master page imize bir isim verdikten sonra (örneğimizde bu isim haberler.master olmalı.) Add tuşuna basıldığında [Select a Master Page] adıyla yeni bir pencere açılacaktır. Bu pencereden de main.master i seçerek OK tuşuna bastığımızda artık yeni bir nested master page'imiz olmuş olur.
    <%@ MasterLanguage="C#"MasterPageFile="~/main.Master"AutoEventWireup="true"  CodeBehind="haberler.master.cs"Inherits="NestedMasterPages_SampleSite.haberler"%>
    <asp:Content ID="Content1" ContentPlaceHolderID="head" runat="server">
    </asp:Content>
    <asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1"runat="server">
      
    </asp:Content>

    Burada, dikkat edilmesi gereken nokta, nested master page imizin Content2 ID li bir ContentPlaceHolder'a sahip olduğudur. Nested master page'a asıl fonksiyonelitesini, bu ContentPlaceHolder'ın içine başka bir ContentPlaceHolder ekleyerek sağlamış olacağız. Yani haberler.master sayfamız şu şekile gelmiş olacaktır:  
    <%@ MasterLanguage="C#"MasterPageFile="~/main.Master"AutoEventWireup="true"  CodeBehind="haberler.master.cs"Inherits="NestedMasterPages_SampleSite.haberler"%>
    <asp:Content ID="Content1" ContentPlaceHolderID="head" runat="server">
    </asp:Content>
    <asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1"runat="server">
        <div style="width:98%; font-family:Tahoma; font-size:14pt; padding:13px;text-align:left;">
            <a href="ekonomi.aspx"target="_self">EkonomiHaberleri</a>&nbsp;&nbsp;&nbsp;
            <a href="spor.aspx"target="_self">SporHaberleri</a>&nbsp;&nbsp;&nbsp;
            <a href="magazin.aspx"target="_self">Magazin Haberleri</a>&nbsp;&nbsp;&nbsp;
            <br />
            <br />

            <asp:ContentPlaceHolderID="cphHaberler"runat="server">
                   Haberler İçeriği Buraya Gelecek
            </asp:ContentPlaceHolder>
        </div>
    </asp:Content>
     oyunlar.master
  3. Yukarıdakine benzer şekilde oyunlar maste Page'imizi ekleyelim.
    <%@ MasterLanguage="C#"MasterPageFile="~/main.Master"AutoEventWireup="true"CodeBehind="oyunlar.master.cs"Inherits="NestedMasterPages_SampleSite.oyunlar"%>
    <asp:Content ID="Content1" ContentPlaceHolderID="head" runat="server">
    </asp:Content>
    <asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1"runat="server">
       <div style="width:98%; font-family:Tahoma; font-size:14pt; padding:13px;text-align:left;">
            <a href="okey.aspx"target="_self">Okey</a>&nbsp;&nbsp;&nbsp;
            <a href="king.aspx"target="_self">King</a>&nbsp;&nbsp;&nbsp;
            <a href="pisti.aspx"target="_self">Pişti</a>&nbsp;&nbsp;&nbsp;
            <br />
            <br />

            <asp:ContentPlaceHolderID="cphOyunlar"runat="server">
                   Oyunlar burada gösterilir.
            </asp:ContentPlaceHolder>
        </div>
    </asp:Content>
  4. Şu an itibariyle elimizde aşağıdakilerbulunmaktadır:
            a)     Main.master:
    a.      Banner
    b.      Sol taraftaki Ana Menü
            b)     Haberler.master:
    a.      Haber İçeriğinin geleceği yerinhemen üzerinde yatay menü
    b.      Bumenüde EkonomiHaberleriSpor Haberleri ve Magazin HaberleriLinkleriBulunmakta.
            c)      Oyunlar.master:
    a.      Oyun İçeriğinin geleceği yerinhemen üzerinde yatay menü
    b.      Bumenüde Okey,  King  ve PiştiLinkleri Bulunmakta.

  5. Şimdi master ve nested master page lerimiz hazır olduğuna göre, bunlarıdefault.aspx
  6. Solution Explorer penceresinden projemizi sağ tıklayıp, Add New Item düğmesine basıyoruz. Açılan pencereden aşağıdaki resimdeki gibi yeni bir weebform ekliyoruz.
    Nested Master Page Kullanan Yeni bir webform (aspx sayfası) eklemekBu pencerede Add butonuna tıklayınca aşağıdaki pencere açılacaktır:
    Nested Master Page Kullanan Yeni bir webform (aspx sayfası) eklemek-2            Bu pencerede de OK tuşuna bastığımızda default.aspx sayfamız projemizee
    Default Sayfamızın içine aşağıdaki gibi bir div eklediğimizde son hali şu hale gelecektir:
    <%@ PageTitle=""Language="C#"MasterPageFile="~/main.Master"AutoEventWireup="true"CodeBehind="default.aspx.cs"Inherits="NestedMasterPages_SampleSite._default"%>
    <asp:Content ID="Content1" ContentPlaceHolderID="head" runat="server">
    </asp:Content>
    <asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1"runat="server">
    <div style="font-family:Times New Roman; font-size:36pt; text-align:center">
            Sitemize Hoşgeldiniz...
    </div>
    </asp:Content>

     haberlerMain.aspx / oyunlarMain.aspx
  7. Default.aspx sayfasının eklenmesine benzer bir şekilde haberlerMain.aspx ve oyunlarMain.aspx sayfalarını ekleyelim. Aşağıdaki resimlerde gösterildiği şekilde bu sayfaları projemize ekleyebiliriz:

    HaberlerMain.aspx webformunun eklenmesi-1
    HaberlerMain.aspx webformunun eklenmesi-2
  8. default.aspx sayfamız main.master'ı kullanıyor. Ana menümüz main.master üzerinde. Buradan [Haberler] linkini tıkladığımızda, haberler.master'ını kullanan (yani haberler alt menüsünü içinde barındıran) haberlerMain.aspx sayfasını açmış oluruz. Benzer şekilde [Oyunlar] linkini tıkladığımızda ise, oyunlar.master'ını kullanan(yani oyunlar alt menüsünü içinde barındıran) oyunlarMain.aspx sayfasını açmış oluruz. 
  9. haberler.master masterpage'ini kullanan ekonomi.aspx, spor.aspx, magazin.aspx sayfalarını yukarıdaki resimlerde haberMain.aspx sayfasını eklediğimiz şekilde projemize ekleriz.
  10. Oyunlar.master master page'ini kullanan okey.aspx, king.aspx, pisti.aspx sayfalarını da yukarıdaki resimlerde görüldüğü gibi projemize ekleriz.
  11. Geriye ise, sadece main.master, oyun.master, haber.master masterPage lerinde bulunan <a> tag'ine sahip olan linklerin href deperlerini set etmek kalıyor. 

        Biraz uzun bir makale oldu gibi:) Ama nested master page i hiç kullanmamış birisinin en iyi şekilde kavrayabileceği bir şekilde anlatmaya çalıştım.
        Proje dosyasını buradan indirebilirsiniz.
        Kolay Gelsin:)