ASP.NET Web Sayfaları (Razor) Siteleri için Site-Wide Davranışını Özelleştirme

yazan: Tom FitzMacken

Bu makalede, ASP.NET Web Sayfaları (Razor) web sitesindeki sayfalar için site tarafı ayarlarının nasıl yapılacağını açıklanmaktadır.

Öğrenecekleriniz:

  • Bir sitedeki tüm sayfalar için değerleri (genel değerler veya yardımcı ayarları) ayarlamanıza olanak tanıyan kodu çalıştırma.
  • Klasördeki tüm sayfalar için değer ayarlamanıza olanak tanıyan kodu çalıştırma.
  • Sayfa yüklenmeden önce ve sonra kod çalıştırma.
  • Merkezi bir hata sayfasına hata gönderme.
  • Klasördeki tüm sayfalara kimlik doğrulaması ekleme.

Öğreticide kullanılan yazılım sürümleri

  • ASP.NET Web Sayfaları (Razor) 2
  • WebMatrix 3
  • ASP.NET Web Yardımcıları Kitaplığı (NuGet paketi)

Bu öğretici, ASP.NET Web Yardımcıları Kitaplığı'nı kullanamayacağınız durumlar dışında ASP.NET Web Sayfaları 3 ve Visual Studio 2013 (veya Web için Visual Studio Express 2013) ile de çalışır.

ASP.NET Web Sayfaları için Web Sitesi Başlangıç Kodu Ekleme

ASP.NET Web Sayfaları'nda yazdığınız kodun büyük bir bölümü için tek bir sayfada bu sayfa için gerekli olan tüm kodlar bulunabilir. Örneğin, bir sayfa e-posta iletisi gönderirse, bu işlemin tüm kodunu tek bir sayfaya koymak mümkündür. Bu, e-posta gönderme (smtp sunucusu için) ve e-posta iletisi gönderme ayarlarını başlatmaya yönelik kodu içerebilir.

Ancak bazı durumlarda, sitedeki herhangi bir sayfa çalışmadan önce bazı kodlar çalıştırmak isteyebilirsiniz. Bu, sitenin herhangi bir yerinde kullanılabilecek değerleri ayarlamak için yararlıdır ( genel değerler olarak adlandırılır).) Örneğin, bazı yardımcılar e-posta ayarları veya hesap anahtarları gibi değerler sağlamanızı gerektirir. Bu ayarları genel değerlerde tutmak kullanışlı olabilir.

Sitenin kökünde _AppStart.cshtml adlı bir sayfa oluşturarak bunu yapabilirsiniz. Bu sayfa varsa, sitedeki herhangi bir sayfa ilk kez istenildiğinde çalışır. Bu nedenle, genel değerleri ayarlamak için kod çalıştırmak iyi bir yerdir. ( _AppStart.cshtml alt çizgi ön ekine sahip olduğundan, ASP.NET kullanıcılar doğrudan istekte bulunsa bile sayfayı tarayıcıya göndermez.)

Aşağıdaki diyagramda _AppStart.cshtml sayfasının nasıl çalıştığı gösterilmektedir. Bir sayfa için istek geldiğinde ve bu sitedeki herhangi bir sayfa için ilk istekse, ASP.NET önce bir _AppStart.cshtml sayfasının var olup olmadığını denetler. Bu durumda , _AppStart.cshtml sayfasındaki tüm kodlar çalıştırılır ve istenen sayfa çalıştırılır.

[App Star nokta CSHTML'nin nasıl çalıştığını gösteren görüntü.]

Web Siteniz için Genel Değerleri Ayarlama

  1. WebMatrix web sitesinin kök klasöründe _AppStart.cshtml adlı bir dosya oluşturun. Dosyanın sitenin kökünde olması gerekir.

  2. Mevcut içeriği aşağıdakilerle değiştirin:

    @{
      AppState["customAppName"] = "Application Name";
    }
    

    Bu kod sözlükte AppState bir değer depolar ve bu değer sitedeki tüm sayfalarda otomatik olarak kullanılabilir. _AppStart.cshtml dosyasının içinde herhangi bir işaretleme olmadığını fark edin. Sayfa kodu çalıştırır ve ardından başlangıçta istenen sayfaya yönlendirilir.

    Not

    _AppStart.cshtml dosyasına kod yerleştirirken dikkatli olun. _AppStart.cshtml dosyasındaki kodda hata oluşursa web sitesi başlatılmaz.

  3. Kök klasörde AppName.cshtml adlı yeni bir sayfa oluşturun.

  4. Varsayılan işaretlemeyi ve kodu aşağıdakilerle değiştirin:

    <!DOCTYPE html>
    <html>
        <head>
            <title>Show Application Name</title>
        </head>
        <body>
            <h1>@AppState["customAppName"]</h1>
        </body>
    </html>
    

    Bu kod, değeri _AppStart.cshtml sayfasında ayarladığınız nesneden AppState ayıklar.

  5. AppName.cshtml sayfasını tarayıcıda çalıştırın. (Sayfayı çalıştırmadan önce Dosyalar çalışma alanında seçili olduğundan emin olun.) Sayfada genel değer görüntülenir.

    [Genel değeri görüntüleyen sayfayı gösteren ekran görüntüsü.]

Yardımcılar için Değerleri Ayarlama

_AppStart.cshtml dosyasının iyi bir kullanımı, sitenizde kullandığınız ve başlatılması gereken yardımcılar için değerler ayarlamaktır. Tipik örnekler, yardımcının WebMail e-posta ayarları ve yardımcının özel ve ortak anahtarlarıdır ReCaptcha . Böyle durumlarda, değerleri _AppStart.cshtml dosyasında bir kez ayarlayabilirsiniz ve ardından bunlar zaten sitenizdeki tüm sayfalar için ayarlanır.

Bu yordam, ayarları genel olarak nasıl ayarlayabileceğinizi WebMail gösterir. (Yardımcıyı WebMail kullanma hakkında daha fazla bilgi için bkz. ASP.NET Web Sayfaları Sitesine Email ekleme.)

  1. ASP.NET Web Yardımcıları Kitaplığı'nı, daha önce eklemediyseniz , ASP.NET Web Sayfaları Sitesine Yardımcı Yükleme bölümünde açıklandığı gibi web sitenize ekleyin.

  2. Henüz bir _AppStart.cshtml dosyanız yoksa, web sitesinin kök klasöründe _AppStart.cshtml adlı bir dosya oluşturun.

  3. aşağıdaki WebMail ayarları _AppStart.cshtml dosyasına ekleyin:

    @{
         // Initialize WebMail helper
         WebMail.SmtpServer = "your-SMTP-host";
         WebMail.SmtpPort = 25;
         WebMail.UserName = "your-user-name-here";
         WebMail.Password = "your-account-password";
         WebMail.From = "your-email-address-here";
    }
    

    Kodda e-postayla ilgili aşağıdaki ayarları değiştirin:

  4. _AppStart.cshtml dosyasını kaydedin ve kapatın.

  5. Bir web sitesinin kök klasöründe TestEmail.cshtml adlı yeni bir sayfa oluşturun.

  6. Mevcut içeriği aşağıdakilerle değiştirin:

    @{
        var message = "";
        try{
            if(IsPost){
                WebMail.Send(
                    to: Request.Form["emailAddress"],
                    subject: Request.Form["emailSubject"],
                    body:Request.Form["emailBody"]
               );
               message = "Email sent!";
            }
        }
        catch(Exception ex){
            message = "Email could not be sent!";
        }
    }
    <!DOCTYPE html>
    <html lang="en">
      <head>
         <meta charset="utf-8" />
         <title>Test Email</title>
      </head>
      <body>
        <h1>Test Email</h1>
        <form method="post">
          <p>
            <label for="emailAddress">Email address:</label>
            <input type="text" name="emailAddress" />
          </p>
          <p>
            <label for="emailSubject">Subject:</label>
            <input type="text" name="emailSubject" />
          </p>
          <p>
            <label for="emailBody">Text to send:</label><br/>
            <textarea name="emailBody" rows="6"></textarea>
          </p>
        <p><input type="submit" value="Send!" /></p>
        @if(IsPost){
            <p>@message</p>
        }
        </form>
      </body>
    </html>
    
  7. TestEmail.cshtml sayfasını bir tarayıcıda çalıştırın.

  8. Kendinize e-posta iletisi göndermek için alanları doldurun ve gönder'e tıklayın.

  9. İletiyi edindiğinizden emin olmak için e-postanızı denetleyin.

Bu örneğin önemli bölümü, smtp sunucunuzun adı ve e-posta kimlik bilgileriniz gibi genellikle değiştirmediğiniz ayarların _AppStart.cshtml dosyasında ayarlanmış olmasıdır. Bu şekilde, e-posta gönderdiğiniz her sayfada bunları yeniden ayarlamanız gerekmez. (Herhangi bir nedenle bu ayarları değiştirmeniz gerekiyorsa, bunları bir sayfada tek tek ayarlayabilirsiniz.) Sayfada, yalnızca alıcı ve e-posta iletisinin gövdesi gibi her seferinde değişen değerleri ayarlarsınız.

Bir Klasörde Dosyadan Önce ve Sonra Kod Çalıştırma

Sitedeki sayfa çalıştırmadan önce kod yazmak için _AppStart.cshtml'yi kullanabileceğiniz gibi, belirli bir klasör çalıştırmasında herhangi bir sayfadan önce (ve sonra) çalışan kod yazabilirsiniz. Bu, klasördeki tüm sayfalar için aynı düzen sayfasını ayarlama veya klasörde bir sayfa çalıştırmadan önce kullanıcının oturum açmış olup olmadığını denetleme gibi işlemler için kullanışlıdır.

Belirli klasörlerdeki sayfalar için , _PageStart.cshtml adlı bir dosyada kod oluşturabilirsiniz. Aşağıdaki diyagramda _PageStart.cshtml sayfasının nasıl çalıştığı gösterilmektedir. Bir sayfa için istek geldiğinde, ASP.NET önce bir _AppStart.cshtml sayfasını denetler ve bunu çalıştırır. Ardından ASP.NET bir _PageStart.cshtml sayfası olup olmadığını denetler ve varsa bunu çalıştırır. Ardından istenen sayfayı çalıştırır.

_PageStart.cshtml sayfasının içinde, işlem sırasında istenen sayfanın bir RunPage yöntem ekleyerek nerede çalıştırılmasını istediğinizi belirtebilirsiniz. Bu, istenen sayfa çalışmadan önce ve sonra yeniden kod çalıştırmanıza olanak tanır. eklemezsenizRunPage, _PageStart.cshtml dosyasındaki tüm kod çalıştırılır ve istenen sayfa otomatik olarak çalıştırılır.

[İstenen sayfanın otomatik olarak nasıl çalıştırılacağını gösteren görüntü.]

ASP.NET , _PageStart.cshtml dosyalarının hiyerarşisini oluşturmanıza olanak tanır. Sitenin köküne ve herhangi bir alt klasöre bir _PageStart.cshtml dosyası koyabilirsiniz. Bir sayfa istendiğinde, en üst düzeydeki (site köküne en yakın) _PageStart.cshtml dosyası çalışır ve ardından sonraki alt klasörde _PageStart.cshtml dosyası ve istek istenen sayfayı içeren klasöre ulaşana kadar alt klasör yapısında aşağı doğru devam eder. Tüm geçerli _PageStart.cshtml dosyaları çalıştırıldıktan sonra istenen sayfa çalışır.

Örneğin, _PageStart.cshtml dosyaları ve Default.cshtml dosyasının aşağıdaki birleşimine sahip olabilirsiniz:

@* ~/_PageStart.cshtml *@
@{
  PageData["Color1"] = "Red";
  PageData["Color2"] = "Blue";
}
@* ~/myfolder/_PageStart.cshtml *@
@{
  PageData["Color2"] = "Yellow";
  PageData["Color3"] = "Green";
}
@* ~/myfolder/default.cshtml *@
@PageData["Color1"]
<br/>
@PageData["Color2"]
<br/>
@PageData["Color3"]

/myfolder/default.cshtml komutunu çalıştırdığınızda aşağıdakileri görürsünüz:

Red

Yellow

Green

Bir Klasördeki Tüm Sayfalar için Başlatma Kodunu Çalıştırma

_PageStart.cshtml dosyalarının iyi bir kullanımı, tek bir klasördeki tüm dosyalar için aynı düzen sayfasını başlatmaktır.

  1. Kök klasörde InitPages adlı yeni bir klasör oluşturun.

  2. Web sitenizin InitPages klasöründe _PageStart.cshtml adlı bir dosya oluşturun ve varsayılan işaretlemeyi ve kodu aşağıdakilerle değiştirin:

    @{
        // Sets the layout page for all pages in the folder.
        Layout = "~/Shared/_Layout1.cshtml";
    
        // Sets a variable available to all pages in the folder.
        PageData["MyBackground"] = "Yellow";
    }
    
  3. Web sitesinin kökünde Paylaşılan adlı bir klasör oluşturun.

  4. Paylaşılan klasöründe _Layout1.cshtml adlı bir dosya oluşturun ve varsayılan işaretlemeyi ve kodu aşağıdakilerle değiştirin:

    @{
      var backgroundColor = PageData["MyBackground"];
    }
    <!DOCTYPE html>
    <html>
    <head>
      <title>Page Title</title>
      <link type="text/css" href="/Styles/Site.css" rel="stylesheet" />
    </head>
    <body>
      <div id="header">
        Using the _PageStart.cshtml file
      </div>
      <div id="main" style="background-color:@backgroundColor">
        @RenderBody()
      </div>
    <div id="footer">
      &copy; 2012 Contoso. All rights reserved
    </div>
    </body>
    </html>
    
  5. InitPages klasöründe Content1.cshtml adlı bir dosya oluşturun ve var olan içeriği aşağıdakilerle değiştirin:

    <p>This is content page 1.</p>
    
  6. InitPages klasöründe Content2.cshtml adlı başka bir dosya oluşturun ve varsayılan işaretlemeyi aşağıdakiyle değiştirin:

    <p>This is content page 2.</p>
    
  7. Content1.cshtml dosyasını tarayıcıda çalıştırın.

    [Tarayıcıda content 1 nokta CSHTML çalıştırmayı gösteren görüntü.]

    Content1.cshtml sayfası çalıştırıldığında, _PageStart.cshtml dosyası ayarlar Layout ve ayrıca bir renge ayarlarPageData["MyBackground"]. Content1.cshtml dosyasında düzen ve renk uygulanır.

  8. Content2.cshtml dosyasını tarayıcıda görüntüleyin.

    Her iki sayfa da _PageStart.cshtml dosyasında başlatılan düzen sayfasını ve rengi kullandığından düzen aynıdır.

Hataları işlemek için _PageStart.cshtml kullanma

_PageStart.cshtml dosyasının bir diğer iyi kullanımı, klasördeki herhangi bir .cshtml sayfasında oluşabilecek programlama hatalarını (özel durumları) işlemek için bir yol oluşturmaktır. Bu örnekte bunu yapmak için tek bir yol gösterilmektedir.

  1. Kök klasörde InitCatch adlı bir klasör oluşturun.

  2. Web sitenizin InitCatch klasöründe _PageStart.cshtml adlı bir dosya oluşturun ve var olan işaretleme ve kodu aşağıdakilerle değiştirin:

    @{
        try
        {
            RunPage();
        }
        catch (Exception ex)
        {
            Response.Redirect("~/Error.cshtml?source=" +
                HttpUtility.UrlEncode(Request.AppRelativeCurrentExecutionFilePath));
        }
    }
    

    Bu kodda, bir bloğun içinde try yöntemini çağırarak istenen sayfayı açıkça çalıştırmayı RunPage denersiniz. İstenen sayfada herhangi bir programlama hatası oluşursa, blok içindeki catch kod çalıştırılır. Bu durumda kod bir sayfaya (Error.cshtml) yönlendirilir ve url'nin bir parçası olarak hatayla karşılaşan dosyanın adını geçirir. (Sayfayı kısa süre sonra oluşturacaksınız.)

  3. Web sitenizin InitCatch klasöründe Exception.cshtml adlı bir dosya oluşturun ve var olan işaretlemeyi ve kodu aşağıdakilerle değiştirin:

    @{
        var db = Database.Open("invalidDatabaseFile");
    }
    

    Bu örnekte, bu sayfada yaptığınız şey, var olmayan bir veritabanı dosyasını açmaya çalışarak kasıtlı olarak bir hata oluşturmaktır.

  4. Kök klasörde Error.cshtml adlı bir dosya oluşturun ve var olan işaretlemeyi ve kodu aşağıdakilerle değiştirin:

    <!DOCTYPE html>
    <html>
        <head>
            <title>Error Page</title>
        </head>
        <body>
    <h1>Error report</h1>
    <p>An error occurred while running the following file: @Request["source"]</p>
        </body>
    </html>
    

    Bu sayfada ifade @Request["source"] değeri URL'nin dışına alır ve görüntüler.

  5. Araç çubuğunda Kaydet'e tıklayın.

  6. Exception.cshtml dosyasını tarayıcıda çalıştırın.

    [Tarayıcıda özel durum noktası CSHTML çalıştırmayı gösteren ekran görüntüsü.]

    Exception.cshtml dosyasında bir hata oluştuğundan, _PageStart.cshtml sayfası iletiyi görüntüleyen Error.cshtml dosyasına yönlendirilir.

    Özel durumlar hakkında daha fazla bilgi için bkz. Razor Söz Dizimi Kullanarak ASP.NET Web Sayfaları Programlamaya Giriş.

Klasör Erişimini Kısıtlamak için _PageStart.cshtml Kullanma

Bir klasördeki tüm dosyalara erişimi kısıtlamak için _PageStart.cshtml dosyasını da kullanabilirsiniz.

  1. WebMatrix'te, Şablondan Site seçeneğini kullanarak yeni bir web sitesi oluşturun.

  2. Kullanılabilir şablonlardan Başlangıç Sitesi'ni seçin.

  3. Kök klasörde AuthenticatedContent adlı bir klasör oluşturun.

  4. AuthenticatedContent klasöründe _PageStart.cshtml adlı bir dosya oluşturun ve var olan işaretlemeyi ve kodu aşağıdakilerle değiştirin:

    @{
        Response.CacheControl = "no-cache";
        if (!WebSecurity.IsAuthenticated) {
            var returnUrl = "~/Account/Login?ReturnUrl=" + Request.Url.LocalPath;
            Response.Redirect(returnUrl);
        }
    }
    

    Kod, klasördeki tüm dosyaların önbelleğe alınmasını engelleyerek başlar. (Bu, bir kullanıcının önbelleğe alınmış sayfalarının bir sonraki kullanıcının kullanımına sunulmasını istemediğiniz ortak bilgisayarlar gibi senaryolar için gereklidir.) Ardından kod, kullanıcının klasördeki sayfalardan herhangi birini görüntüleyebilmesi için önce sitede oturum açıp açmadığını belirler. Kullanıcı oturum açmadıysa, kod oturum açma sayfasına yönlendirilir. adlı ReturnUrlbir sorgu dizesi değeri eklerseniz, oturum açma sayfası kullanıcıyı başlangıçta istenen sayfaya döndürebilir.

  5. AuthenticatedContent klasöründe Page.cshtml adlı yeni bir sayfa oluşturun.

  6. Varsayılan işaretlemeyi aşağıdakilerle değiştirin:

    @{
        Layout = "~/_SiteLayout.cshtml";
        Page.Title = "Authenticated Content";
    }
    <!DOCTYPE html>
    <html>
      <head>
        <meta charset="utf-8" />
      </head>
      <body>
        Thank you for authenticating!
      </body>
    </html>
    
  7. Page.cshtml dosyasını tarayıcıda çalıştırın. Kod sizi bir oturum açma sayfasına yönlendirir. Oturum açmadan önce kaydolmanız gerekir. Kaydolup oturum açtıktan sonra sayfaya gidebilir ve içeriğini görüntüleyebilirsiniz.

Ek Kaynaklar

Razor Söz Dizimini Kullanarak ASP.NET Web Sayfaları Programlamaya Giriş