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

Çarşamba, Mayıs 05, 2010

Asp.Net MVC – Microsoft Report Yardımı ile Raporlama

Asp.Net MVC Framework ile geliştirilen uygulamalar oldukça fazlalaşmaya başladı. Bu artış ile birlikte uygulamaların içerisinde yapılacak işlemlerden beklenen beklentilerde o oranda artmaktadır. Önceleri sadece verileri göstersin, rahatça veri tabanına kayıt yapalım, silelim, güncelleme yapabilmesi gibi yetkinlikleri basitçe yapabilmesi kolaylık olarak görülürken bir süre sonra kullanmış olduğumuz master page 'in tasarımını da kolayca yenileyebilelim, toolbox içerisinde yer alan bileşenleri artsın, code snippet lar eklensin gibi bir çok istek oluşmuş ve bunlar yapılabilmiştir. Ancak bu noktada code snippet lar dışında bahsedilen diğer özellikler zaten yapılabiliyorken geliştiricilerin önceliğinden ötürü fazla göz önünde değillerdi. Biz de daha önce hazırlamış olduğumuz yazıları bu doğrultuda yönlendirerek beklentileri karşılamaya çalıştık. Şimdi ise MVC 'ten yeni beklentimiz *.RDLC uzantılı dosyaların MVC uygulamaların içerisinde görüntülenmesi için yapılması gereken işlemleri inceliyor olacağız.

Geliştirecek olduğumuz uygulamayı Visual Studio 2008 ve .Net Framework 3.5 üzerinde geliştiriyor olacağız. Visual Studio 2008 üzerinde uygulama şablonunu  MVC 2 ile geliştireceğimizi düşündüğümüzde .Net sürümünün 3.5 SP1 olmasına dikkat etmeniz gerekmektedir. Zaten aksi bir durum söz konusu ile sisteminize MVC 2 sürümünü kuramayacak ve hata alacaksınızdır. Eğer ki Windows 7 kullanılıyor ve kurarken sorun yaşıyorsanız bu bağlantı yardımı ile sorununuzu çözebilir ve işlemlerinize sorunsuzca devam edebilirsiniz.

Hazırlayacağımız örnek için boş bir MVC2 uygulama oluşturarak başlıyoruz.

mak88_1

Proje oluştuğuna göre veri tabanından verileri çekip kullanabilmek için uygulama üzerinde gerekli tanımlamaları yapmak gerekiyor. Ado.Net Entity Data Model yardımı ile veri tabanında yer alan nesneleri kolayca oluşturup kullanabileceğimiz için bu şablonu seçerek adımlara devam ediyoruz.

mak88_2

Veri tabanı bağlantısı için gerekli olan connection string oluşturulur.

mak88_3

Veri tabanı ile bağlantı için gerekli olan cümle oluşturulduktan sonra bundan yararlanarak Northwind veri tabanı içerisinde yer alan tablo, view ve sp leri görüntülüyor olacağız. Örneğimizde Customer tablosundan yararlanacağımız için sadece bu tablo seçilerek işlemi tamamlıyoruz.

mak88_4

Bir sonraki adım da RDLC raporu oluşturmak için Content dizininin içerisine Reports klasörünü oluşturuyor ve içerisine Report.rdlc 'i aşağıdaki şekilde ekliyoruz.

mak88_5

Eklemiş olduğumuz report şablonu arka plan bir veri yapısı ile çalışmaktadır. Bu dataset, entity model ya da herhangi bir generic koleksiyon olabilmektedir. Biz eklemiş olduğumuz Northwind Entities içerisinde yer alan Customers tablosunda yararlanabilmek için Model katmanının içerisine Customer.cs 'i ekleyerek aşağıdaki kod bloğunu ekliyoruz.

mak88_6

[C#]
using System.Collections.Generic;
using System.Linq;

namespace RDLC.Models
{
    public class Customer
    {

        public static List<RDLC.Models.Customers> GetAllCustomers()
        {
            var entities = new NorthwindEntities1();
            var x = from c in entities.Customers
                       select c;
            return x.ToList();
        }
    }
}

Hazırlamış olduğumuz kullanıcı listesi getiren generic list 'i report şablonu üzerinde gösterip kullanabilmemiz gerekmektedir. Bunun için Data menüsünün altında yer alan ShowDataSource seçeneği yardımı ile kullanılabilecek olan veri modellerini görüntüleyebiliriz.

mak88_7

Not: Eğer ki data menüsünün altında Show Data Sources seçeneğini görüntüleyemediyseniz bağlantı üzerinden yapmanı gereken işlemleri bulaibilirsiniz.

Raporu ekledikten sonra görüntülemek istediğimiz verileri Website Data Sources kısmından rapor ekranına sürükleyerek görüntülenmesi için gerekli olan işlemleri hazırlamış bulunuyoruz. Bu işlemler sonrasında bizim hazırlamış olduğumuz rapor tasarımı aşağıdaki gibi olmuştur.

mak88_8

Yapacağımız sıradaki işlem Controller katmanını oluşturup sonrasında bu katmandan yararlanacak olan View sayfasını oluşturmak ve kullanmak olacaktır.

mak88_9

[C#]
using System.Web.Mvc;

namespace RDLC.Controllers
{
    public class HomeController : Controller
    {
        public ActionResult Index()
        {
            string welcomeMessage = "Northwind Müşteri Listesine Hoşgeldiniz";
            return View((object)welcomeMessage);
        }
    }
}

Controller katmanını kullanarak Index() üzerinde sağ tıklama yaparak View sayfasının oluşturulması için gerekli olan işlemleri yapıyoruz.

mak88_10

[Markup]
<%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage<string>" %>

<!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 runat="server">
        <title>Index</title>
    </head>
    <body>
        <div>
           <h2>
               <%=Html.Encode(Model) %></h2>
           <%=Html.ActionLink("Müşteri Listesi (PDF)","DetailsReport","Customers") %>
        </div>
    </body>
</html>

Oluşturulan view 'i görüntülediğimizde istediğimiz sonucu elde etmiş olacağız. Ancak ActionLink içerisinde vermiş olduğumuz adrese yani DetailsReport controller 'ına yönlenmek istediğinde yolu bulamıyorum şeklinde bir hata verecektir ki bu olası bir durumdur. Çünkü henüz bu metodu oluşturmadık.

mak88_11
 
Şimdi rapor verilerini görüntüleyebilmek için gerekli olan işlemleri yapıyor olacağız. Bunun için ilk olarak projeye Microsoft.ReportViewer.WebForm DLL 'i ekleyerek başlıyoruz.

mak88_12

Raporu görüntüleyebilmek için gerekli DLL 'i projeye ekledikten sonra müşterilerin verilerini web sayfasında görüntüleyebilmek için yapacağımız işlemleri yapacağımız controller katmanını ekliyoruz.

[C#

using System.Web.Mvc;
using Microsoft.Reporting.WebForms;
using RDLC.Models;

namespace RDLC.Controllers
{
    public class CustomerController : Controller
    {
        public ActionResult Index()
        {
            return View();
        }

        public ActionResult DetailsReport()
        {
            LocalReport localReport = new LocalReport();
            localReport.ReportPath = Server.MapPath("~/Content/Reports/CustomerReport.rdlc");
            ReportDataSource reportDataSource = new ReportDataSource("Customers", Customer.GetAllCustomers());

            localReport.DataSources.Add(reportDataSource);
            string reportType = "PDF";
            string mimeTpe;
            string encoding;
            string fileNameExtension;

            string deviceInfo = "<DeviceInfo>" +
                    " <OutputFormat>PDF</OutputFormat>" +
                    " <PageWidth>8.5in</PageWidth>" +
                    " <PageHeight>11in</PageHeight>" +
                    " <MarginTop>0.5in</MarginTop>" +
                    " <MarginLeft>1in</MarginLeft>" +
                    " <MarginRight>1in</MarginRight>" +
                    " <MarginBottom>0.5in</MarginBottom>" +
                    "</DeviceInfo>";

            Warning[] warnings;
            string[] streams;
            byte[] renderedBytes;

            renderedBytes = localReport.Render(
                                       reportType,
                                       deviceInfo,
                                       out mimeTpe,
                                       out encoding,
                                       out fileNameExtension,
                                       out streams,
                                       out warnings);
             // Oluşan rapor sayfa içerisinde görüntülenmek isteniyorsa aşağıdaki kod parçası kapalı olmalıdır. Eğer ki ayrı bir sayfada
             // görüntülenmek istiyorsanız ise kod parçasını açmanız gerekmektedir.
             //Response.AddHeader("content-disposition", "attachment; filename=NorthWindCustomers." + fileNameExtension);

             return File(renderedBytes, mimeTpe);
        }
    }
}

Nesne olarak oluşan veriler için gerekli işleme işlemleri yapıldıktan sonra Microsoft Report içerisinde gösterilme işlemini tamamlamış oluyoruz. Sonuç aşağıdaki gibidir.

mak88_14

Sonuç olarak bu yazımızda Asp.Net MVC 2 ile hazırlamış olduğumuz uygulamaların içerisinde Microsoft Report aracılığıyla nasıl raporlama yapabileceğimizi incelemeye çalıştık.

Umarım sizler için yararlı olabilmiştir.

Kaynak
MSDN

Turhal Temizer

info@turhaltemizer.com

Pazartesi, Mayıs 03, 2010

Asp.Net MVC Framework - RSSFeed

Asp.Net MVC Framework – RSSFeed

 

ASP.NET MVC Framework ilk çıktığı günden bu yana gelişimi ve web geliştiricilerin üzerinde ki beğeni etkilerini incelediğimizde sürekli artan bir grafik olduğunu gözlemleriz. Bu doğrultuda artık geliştiriciler yavaş yavaş uygulamlarını MVC Framework 'e geçirmek için planlar yapıyorlar. Bu doğrultuda Asp.Net web sayfalarında yapmış oldukları yapıları da Asp.Net MVC Framework 'te kullanmak isteyeceklerdir ki bu da en olası durumdur. Daha önceden incelemiş olduğumuz konularıdaki yazılarda da değindiğimiz MVC ile hazırlanan web sayfaları gazatecilik, blog, topluluk ve bunun gibi diğer bir çok sistem için oldukça uyumlu bir yapı olduğundan defalarca bahsetmiştik. Bu web uygulamalarında en çok göze batan ve dikkat edilen özellik ise RSS bilgilerinin gösteriliyor olmadır. Bu yazımızda Asp.Net MVC Framework yardımı ile RSS bilgisini site içerisinde nasıl gösterebileceğimizi inceliyor olacağız.

İsterseniz daha önceden hazırlamış olduğunuz uygulamanızın üzerine isterseniz de yeni oluşturacağınız bir uygulamanın içeriğine controller sınıfı ekleyerek adını RSSFeedController olarak belirterek işlemlerimizi yapmaya başlıyoruz.

image.axd

Controller sınıfını oluşturduktan sonra RSS verilerini rahatlıkla işleyebilmek için projeye System.ServiceModel.Web.dll 'i referans gösteriyoruz. System.ServiceModel isim içerisinde yer alan Syndication isim alanı RSS işlemleri için gerekli olan işlemleri yapabilmemize olanak tanır.

Bu durumda bahsetmiş olduğumuz isim alanını kullanarak Controller içerisinde yer alacak olan metodu hazırlayabiliriz.

System.ServiceModel.Syndication; // System.ServiceModel.Web.dll referans olarak ekleniyor.
public class RSSFeedController : Controller
{
    public ActionResult RSSFeed()
    {
        string strFeed = "blabla.feed"; //RSS Feed adresi girilecek
        using (XmlReader reader = XmlReader.Create(strFeed))
            {
                SyndicationFeed rssData = SyndicationFeed.Load(reader);
                return View(rssData);
        }
    }
}

Controller sınfını ve içerisinde yer alacak olan ActionResult 'ı hazırladıktan sonra şimdi gerekli view 'ı oluşturup gerekli içeriği hazırlayarak işlemleri tamamlayabiliriz.


<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<SyndicationFeed>" %>
<%@ Import Namespace="System.ServiceModel.Syndication"%>
<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
RSSFeed
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
<h2>RSSFeed</h2>
<% foreach (var item in ViewData.Model.Items)
{
string URL = item.Links[0].Uri.OriginalString;
string Title = item.Title.Text;
Response.Write(string.Format("<p><a href=\"{0}\"><b>{1}</b></a>", URL, Title));
Response.Write("<br/>" + item.Summary.Text + "</p>");
} %>
</asp:Content>

İsim alanını ekledikten sonra RSS 'te yer alan URL, konu başlığı ve içeriğini de gösterek RSSFeed i hazırlamış oluyoruz. Yaptığımız işlemler sonrasında karşımıza çıkan ekran görüntüsü aşağıdaki gibi olacaktır.

image.axd

Sonuç olarak istediğimiz işlemi başarılı bir şekilde sağlamış oluyoruz. Yukarıda yapmış olduğumuz örnek ise Asp.Net geliştirme takımının msdn içerisindeki blogundaki içerikleri göstermektedir.

Sonuç olarak bu yazımızda System.ServiceModel.Syndacation isim alanını kullanarak RSS Feed 'in nasıl hazırlanabileceğini incelemeye çalıştık.

Umarım sizler için yararlı olabilmiştir.

Kaynak
MSDN

Turhal Temizer

info@turhaltemizer.com

Çarşamba, Mart 24, 2010

Asp.Net MVC Framework 1.0 ‘ten Asp.Net MVC Framework 2.0 ‘a Uygulamaları Yükseltmek (Upgrading)

Asp.Net MVC Framework cephesinde Microsoft geliştirmelerine son sürat devam ediyor. Bunun sonuçları olarakta çok yakın bir zaman da MVC Framework 2.0 sürümü yayınlandı. Bu sürüm ile gelen yenilikleri zaman içerisinde inceliyor olacağız. Ancak şimdi aklımızı kurcalayan ve daha önemli bir konu olan MVC Framework 1.0 ile geliştirilmiş olan uygulamaların akıbeti ne olacak konusunu inceliyor olacağız.

MVC Framework 1.0 ‘ın çıkışı ve kullanım kolaylıkları sebebi ile bir çok web uygulama geliştiricisi bu tasarı ile uygulama nasıl geliştirileceğini yoğun bir şekilde inceledi. Geçen zaman içerisinde de bir kısmı uygulama geliştirerek çok başarılı ürünler çıkartmış oldular. Ülkemizde de fazlaca örneği bulunmaktadır. En büyük faydalarından bir kaçı ise, ID ‘ler ile gereksiz sayfa fazlalığının önüne geçilmesi, entity katmanların yoğun bir şekilde kullanılıyor olması, katmansal mimarinin web uygulamalarında rahatlıkla kullanılabiliyor olması, URL yönlendirme işlemlerinin rahatça yapılabilmesi gibi aklımıza bir çırpıda gelenleri bunlardır.

Evet zaman içerisinde bir çok uygulamanın geliştirildiğinden bahsettik. Eğer ki ortada geliştirilen bir ürün varsa bu ürünün yeni çıkan sürümlerine de uyarlanabiliyor olması gerekmektedir. Bu temek kural sebebi ile Asp.Net MVC Framework 1.0 ile geliştirilen web uygulamalarının Asp.Net MVC Framework 2.0 sürümüne yükseltilmesi esnasında yapılması gereken adımlara değinerek bu ihtiyacımızı nasıl gerçekleştirebileceğimizi incelemeye çalışıyor olacağız.

MVC Framework 1.0 sürümünden MVC Framework 2.0 sürümüne yükseltmek için kullanabileceğimiz iki yöntem bulunmaktadır. Bunlardan birincisi bir sihirbaz yardımı ile bir diğeri ise de direk uygulamaya elle müdahale ederektir.

1.) Sihirbaz Yardımı ile Yükseltmek

Sihirbaz yardımı ile MVC Framework 1.0 ile hazırlamış olduğunuz web sayfalarını MVC Framework 2 sürümüne yükseltmek için MvcAppConverter-MVC2RTM.zip (255 KB)  dosyasını bilgisayara indirdikten sonra uygulama dosyasını yani *.sln dosyasını gösterdikten sonra kendisi otomatik olarak dönüştürme işlemini gerçekleştiriyor olacaktır.

 

Peki bu sihirbaz dönüştürme işlemini güzelce yaptı. Ama hangi dosyaların üzerinde değişiklik yapıldığını ve nasıl kullanabileceğizi öğrenmek ihtiyacı hissedebiliriz . Bu bilgiler temel olarak aşağıda yer almaktadır.

  • Visual Studio 2008 ile yapılan uygulamalar üzerinde dönüştürme yapılabilmektedir.
  • Dönüştürülen bütün uygulamanın yedeği alınır
  • C# ve VB ile geliştirilmiş olan uygulamalarda System.Web.Mvc.dll üzerinde güncelleme yapılmaktadır.
    •     Referansları Asp.NET MVC 2 sürümüne göre güncellenir.
    •    System.ComponentDataMode.DataAnnotations 3.5 eklenmektedir.
    • Uygulama üzerinde de değişiklikler yapılmaktadır
    •     Uygulama tipi Asp.Net MVC 2 nin proje şablonu ile uyumlu olacak şekilde değişikliğe uğrar.
    •     web.config üzerinde yer alan referans bilgileri güncellenir.
    •     Yönlendirme yapısı Asp.NET MVC 1.0 ile olan uyumluluğundan Asp.NET MVC 2.0 için uyumluluğa geçmektedir.
    •    /Views/web.config içerisinde yer alan referans bilgileri güncellenmektedir.
    •     JavaScript dosyalarına JQuery bilgileri eklenir ya da güncellenir.

      Sihirbaz ile yapılan işlemler yukarıdaki adımları izleyecek şekilde olacaktır.

      Yukarıdaki sihirbazı henüz Visual Studio 2010 ve .Net Framework 4.0 üzerinde kullanabilmeniz mümkün değildir. Ancak geliştiricileri bu sürümler içinde dönüştürülme işleminin sağlanması için gerekli çalışmaların yapıldığını belirtilmektedir.

    Ancak sizler ben sihirbaz ile işlemlerimi yapmayı sevmiyorum ya da bu değişiklikleri kendim değiştirmek istiyorum diyorsanız işte bu durumda el ile yükseltme adımlarını takip etmeniz gerekmektedir.

2.) Elle Yükseltmek

Biraz önce başarılı bir yazılımcı tarafında hazırlanmış olan yükseltme sihirbazını kullarak uygulamalarımızı nasıl yeni sürüme yükseltebileceğimizi inceledik. Şimdi ise adım adım biz yapmak istersek bu işlemleri nasıl yapabileceğimize değiniyor olacağız.

Öncelikle MVC Framework 2 sürümünü kullanabilmek için Visual Studio 2008 ve .Net Framework 3.5 'in SP1 sürümlerinin bilgisayarınızda kurulu olması gerekmektedir.

Not: Windows 7 kullanıcıları sadece Visual Studio 2008 ‘in SP1 ‘inin kurmaları yeterli olacaktır. Bilindiği kadarıyla Windows 7 .Net Framework 3.5 SP1 kurulu olarak gelmektedir. Ancak bu özellikleri kullanabilmek için windows özelliklerini aç/kapa ekranını kullanarak .net Framework 3.5.1 seçeneğinin altında yer alan bütün seçeneklerin seçili duruma getirilmesi gerekmektedir. Aksi taktirde Asp.Net MVC 2 sürümünü bilgisayarınıza kuramayacak ve aşağıda anlatacağımız ya da yukarıda anlatmış olduğumuz işlemleri yapamıyor olacaksız.

Gerekli geliştirme araçlarına sahip olduğumuza göre MVC Framework 1.0 ile geliştirilmiş olan web uygulamasını yükseltmeye başlayabiliriz. Bu işlemi adım adım anlatıyor olacağız.

1. Projenin yedeğinin alınması gerekmektedir.

2. *.csproj proje dosyasını not defteri yardımı ile açtıktan sonra ProjectTypeGuid nesnesinin değerine ulaşmamız gerekecektir. Bulmamız gereken GUID {603c0e0b-db56-11dc-be95-000d561079b0} ile {F85E285D-A4E0-4152-9332-AB1D724D3325} şeklindedir. bu değeri bulduktan sonra {F85E285D-A4E0-4152-9332-AB1D724D3325};{349c5851-65df-11da-9384-00065b846f21};{fae04ec0-301f-11d3-bf4b-00c04f79efbc} değerleri ile değiştirilmesi gerekmektedir.

3. Web uygulamasının bulunduğu klasöre eriştikten sonra Web.Config dosyası açılır ve içerisinde verilmiş olan referanslardan System.Web.MVC, Version=1.0.0.0 yazınını bulduktan sonra bu referans bilgisini System.Web.MVC, Version=2.0.0.0 olacak şekilde güncelliyoruz.

4. Views klasörünün içerisinde yer alan Web.config dosyasına da 3. maddede yer alan değişiklikleri uyguluyoruz.

5. Visual Studio ile MVC 1.0 ile hazırlanmış olan projeyi açtıkan sonra (Yukarıdaki değişiklikleri yapmış oluyoruz tabikii) Referanslar bölümünde yer alan System.Web.MVC referansını siliyoruz (1.0 sürümünü). Sonrasında System.Web.Mvc ‘nin 2.0 olan sürümüne ilişkin dll ‘i projeye referans olarak ekliyoruz.

6. Web.config dosyasının içerisine bindingRedirect nesnesinin kullanılabilmesi için aşağıdaki yapılandırma dosyasını ekliyoruz.

<runtime>
  <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
    <dependentAssembly>
      <assemblyIdentity name="System.Web.Mvc"
publicKeyToken="31bf3856ad364e35"/>
      <bindingRedirect oldVersion="1.0.0.0"
newVersion="2.0.0.0"/>
    </dependentAssembly>
  </assemblyBinding>
</runtime>

7. Script dosyasınına yeni eklenenleri kullanabilmek için yeni bir MVC 2.0 projesi oluşturduktan sonra olmayan MVC 1.0 ile hazırlanmış olan uygulamada olmayan script dosyalarını 2.0 projesinin içerisinden diğerine kopyalıyoruz.

8. Biraz önce oluşturmuş olduğumuz MVC 2.0 projesi içerisinde yer alan CSS ‘i kullanmak istiyorsanız Site.css ‘i eski projede aynı dosyada yer alan şekilde kopyalıyoruz.

9. Yapılan değişiklikler sonrasında uygulamamızı derliyor ve sorunsuzca çalıştırıyoruz.

El ile adım  adım yaptığımız da gördüğünüz gibi aslında yapacağımız işlemleri basitçe gerçekleştirebilmemiz mümkündür.

Sonuç olarak bu yazımızda Asp.NET MVC Framework 1.0 ile hazırlanmış olan web uygulamalarını Asp.NET MVC Framework 2.0 ‘a yükseltirken hangi adımları uygulayacağımızı hem sihirbaz yardımı ile hem de adım adım bizlerinde nasıl yapabileceğini inceleyerek değinmeye çalıştık.

Umarım Yararlı olabilmiştir.

Kaynaklar
MSDN
Upgrading Wizard

Turhal Temizer

Salı, Mart 23, 2010

Asp.Net MVC Framework 2.0 RTM – Windows 7 Kurulum

Bildiğiniz üzere bir süre önce Asp.Net MVC Framework ‘ün 2. versiyonu yayınlandı. Bizlerde bu uygulamayı hemen kurmak istedik. Ancak Windows 7 kullanan bazı geliştiriciler kurulum esnasında bir sorun yaşadılar ki, hata mesajı olarak .Net Framework 3.5 SP1 ’in sistemde bulunmadığına ilişkindir. Ancak bilindiği üzere Windows 7 işletim sistemi .Net Framework 3.5.1 yani SP1 ‘li versiyonu ile ilk kurulum anından itibaren çalışmaktadır.

Yukarıda bahsettiğimiz türde bir hata alan geliştiricilerin yapması gereken Denetim Masasına girdikten sonra program özelliklerini aç/kapa linkine tıkladıktan sonra karşılarına gelen ekranda .Net Framework 3.5.1 olan bölümlerinde alt başlıkları ile seçmek ve sonrasında işlemi tamamlamak olacaktır. Bu işlem sonrasında bilgisayarınızı yeniden başlatmanız gerekmektedir. Artık bilgisayarınıza Asp.Net MVC Framework 2 ‘yi sorunsuzca kurabilirsiniz.

Not: Görünümü yenilenmiş olan www.asp.net sitesi yardımı ile gerekli bileşenleri bilgisayarınıza indirip yenilikleri takip edebilmeniz mümkündür.

İyi çalışmalar

Pazartesi, Mart 15, 2010

Asp.Net MVC 2 RTM

Merhabalar,

MVC Framework 'un 2.0 sürümü artık RTM olmuş durumdadır. Aşağıda verecek olduğumuz link yardımı ile indirip bilgisayarınıza kurabilmeniz mümkündür. Yakın zaman içerisinde MVC Framework 1.0 ile hazırlanmış olan uygulamaları nasıl 2 sürümüne yükseltebileceğimize ve 2 sürümü ile gelen yenilikleri detaylı bir biçimde inceliyor olacağız.

İndirmek için tıklayınız.

Pazartesi, Ekim 05, 2009

Asp.Net MVC Framework - Güvenlik (Authorization)

Asp.Net MVC Framework ile neler yapabileceğimizi incelemeye Authentication konusuna değinerek devam ediyoruz. Web sayfalarının güvenliği denildiğinde akla gelen ilk iki sözden biridir Authentication. Son kullanıcıya gösterilecek olan sayfaların kimler tarafından görüntülenebileceği hangi roller yardımı ile görüntülenebileceği konusunda yapılan güvenlik işlemlerine denmektedir. Tabii web uygulamalarında bu kadar sık kullanılan bu işlemin (hatta olmazsa olmazlarındandır) MVC Framework ile hazırlanan uygulamalarda olmaması beklenemezdi. Authentication edilmiş olan kullanıcıların sayfaları görüntülerden nasıl etkiler alabileceğini ve Controller katmanında bu kontrolleri temel anlamında nasıl yapabileceğimizi açıklayacak olduğumuz bu yazı ile güvenlik konusuna da giriş yapmış oluyoruz.

Web Site Administrator Tools Kullanımı

Güvenlik konulu yazımızı incelerken ilk olarak yapılması gereken web sayfasını görüntüleyebilecek yetki seviyelerine ilişkin kişileri ve rolleri oluşturmak olacaktır. Hepimiz alışık olduğu gibi Visual Studio ortamında geliştirilen web uygulamalarında Asp.Net Configuration seçeneği yer almaktadır. Bunun yardımı ile web uygulamaları ile ilgili temel işlemlerin yapılabilmesi mümkündür. Ayrıca bu ekranın içerisinde karşımıza çıkan ekrana en genel anlamda Web Site yönetim aracıda denilmektedir. bu ekranı açabilmek için projenin içerisinde yer alan web uygulamasına bir kez tıklama yapıldıktan sonra üst tarafta beliren asp.net configuration seçeneğine tıklıyoruz.



Açılan Web site yönetim aracından güvenlik sekmesine tıkladıktan sonra yeni kullanıcı oluştur linkine tıklayarak site içerisinde belirti bir role sahip olacak olan kullanıcı oluşturuyoruz.

Not: Sizlerin oluşturmuş olduğu web uygulamalarında eğer ki güvenlik sekmesine tıkladığınızda eğer ki veri kaynağını seçiniz şeklinde bir mesaj alıyorsanız bu web.config dosyanızın düzenlenmemiş olmasından olma ihtimali yüksektir. Bu durumda web site yönetim aracı sayfasını kapattıktan sonra MVC uygulamanızı bir kez çalıştırdıktan sonra tekrardan bu ekrana girerseniz sorunsuzca işlemleri yapabiliyor olabileceksiniz.



Kullanıcıyı sorunsuzca oluşturduktan sonra bu kullanıcıya bir rol atama işlemini yapalım.  Bunun için ilk olarak güvenlik sekmesi içerisinde yer alan rolleri aktifleştir (enabled roles) linkine tıkladıktan sonra yeni bir rol oluştur (Create or Manage roles) linkine tıklayarak yeni bir rol oluşturuyoruz.



Not: Eğer ki rol oluştururken Asp.Net SQL Role Provider içeren bir hata alırsanız Provider sekmesi içerisinde yer alan linklerden yararlanarak bu sorunu gerekli provider leri test ederek sorunu çözebilmeniz mümkündür.

Sorunsuzca rolü de oluşturduktan sonra bu rolü de kullanacak bir kullanıcı daha oluşturalım. Bunun için tekrardan yeni kullanıcı oluşturduğumuz ekrandan yararlanıyoruz. Yalnızca sağ tarafta yer alan roller bölümünden oluşturduğumuz rolü de seçtikten sonra kullanıcıyı oluştur butonuna tıklıyoruz.



Bu işlemde sorunsuz bir şekilde tamamlandı. Buraya kadar yaptıklarımıza kısaca özetlemek gerekirse, sertur ve turhal isimli iki kullanıcı oluşturduk. Ayrıca yonetici isimli bir tane de rol oluşturduk. Sonrasında turhal isimli kullanıcı yonetici rolüne atandı.

Authorization Gerekliliği

Site içerisinde kullanılan kimlik denetimlerine uyumlu kullanıcıları seçme işlemini Authorization ile gerçekliyoruz. Authorization işlemini kullanmak için Controller içerisinde yer alan action 'ların üst kısmına ekleyecek olduğumuz [Authorize] özniteliği yardımı ile sağlıyoruz.

Bu işlemi kısaca örneklemek gerekirse HomeController sınıfının içerisine SirketGuvenligi isimli yeni bir action ekliyerek buna [Authorize] özniteliğini ekleyerek kullanılabilmesine olanak tanıyoruz.

Controller\HomeControllers.cs
using System.Web.Mvc;

namespace Security1.Controllers
{
    [HandleError]
    public class HomeController : Controller
    {
        public ActionResult Index()
        {
            ViewData["Message"] = "Welcome to ASP.NET MVC!";

            return View();
        }

        public ActionResult About()
        {
            return View();
        }

        [Authorize]
        public ActionResult SirketGuvenligi()
        {
            return View();
        }
    }
}

Eğer ki web sayfasında kullanıcı girişi yapılmadan adres çubuğuna /Home/SirketGuvenligi adresine giriş yapılmak istenirse, buna izin vermeyecek ve kullanıcı giriş ekranına yönlendirecektir. Bu ekran üzerinde de yeni bir kullanıcı oluşturulabilmesi imkanı vardır.



Ekran görüntüsünde de görüldüğü gibi girişe izin verilmemektedir. Eğer o kişinin kullanıcı adı ve şifresi varsa giriş yapabilecektir. Aksi durumda ise yeni bir kullanıcı oluşturarak yine bu sayfaya girebilmesi mümkün olacaktır. Şimdi herhangi bir kullanıcı ile web uygulamasına giriş yapıyor ve /Home/SirketGuvenligi isimli sayfaya giriş yapmayı deniyoruz. Bu durumda karşımıza aşağıdaki gibi bir sonuç çıkacaktır.



Sonuç istediğimiz gibi artık web sayfasına üye olmayan kullanıcılar bizim yetki ile girilen sayfalara girmesini engellemiş bulunuyoruz.

Kullanıcı ve Rol Authorizing

Controller içerisinde yer alan actionların üst kısmına [Authorize] özniteliğinden yararlanarak belirtmiş olduğumuz sayfalara kullanıcı girişi olmadan girilmesine engelleyebiliyoruz. Ayrıca bu özniteliğin özelliklerinden yararlanarak kullanıcı ve rol bazlı olarak giriş yapılabilmesine olanak tanıyabiliriz. Bu işlem için SerturGuvenlik() ve YoneticiGuvenlik() isimli actionları Controller sınıfına ekliyoruz


Controller\HomeControllers.cs
using System.Web.Mvc;

namespace Security1.Controllers
{
    [HandleError]
    public class HomeController : Controller
    {
        public ActionResult Index()
        {
            ViewData["Message"] = "Welcome to ASP.NET MVC!";

            return View();
        }

        public ActionResult About()
        {
            return View();
        }

        [Authorize]
        public ActionResult SirketGuvenligi()
        {
            return View();
        }

        [Authorize(Users = "Sertur")]
        public ActionResult SerturGuvenlik()
        {
            return View();
        }

        [Authorize(Roles = "Yonetici")]
        public ActionResult YoneticiGuvenlik()
        {
            return View();
        }
    }
}

Bu işlemlerden sonra gerekli viewları oluşturduktan sonra her ikisi içinde kullanıcı girişi yaparak sayfaları denediğimizde yetkilendirmenin başarılı bir şekilde gerçekleştiğini gözlemleyebiliriz.

Örnek olarak Sertur kullanıcı ile sisteme giriş yapıldığında Home/YoneticiGuvenlik adresine giriş yapıldığında yetkiden ötürü girilemediği görülmektedir. Bir diğer örnek olarak ise, başka bir kullanıcı ile sisteme giriş yapıldıktan sonra SerturGuvenlik adresine giriş yapıldığında yine giriş yapılamadığı gözlemlenecektir.

Authentication Ayarlamak

MVC uygulamalarında var sayılan olarak kullanılan veri tabanını düzenleyebilme olanağımızda yer almaktadır. Geliştirilen uygulamaları incelediğimizde Login kontrollerinden alışık olduğumuz aspnetdb.mdf dosyasından yararlanıldığı gözlemlenebilecektir. Hazırlanmış olan projenin bütün dosyalarını görüntüle dediğimizde de veri tabanı dosyasının App_Data klasörünün içerisinde yer aldığı görebiliriz.



Eğer ki bizler yeni bir veri tabanı eklemek istersek C:\Windows\Microsoft.NET\Framework\v2.0.50727 yolunda yer alan aspnet_resql uygulamasını çalıştırarak yeni bir ver tabanı oluşturabilinmesi mümkündür.



Bu işlem sonrasında SQL Server Management Studio yardımı ile aspnetdb veritabanını görüntüleyebilmemiz mümkündür. Sonrasında web.config dosyası içerisinde kendi SQL serverımızın çalıştığı sunucu adını, kullanıcı adını ve şifresini de vererek düzenleme yapabilir, kendi veri tabanımız ile çalışabilinmesi mümkündür.

Eğer ki bu veri tabanının çalışmasına özgü bir SQL kullanıcı oluşturulmak istenirse SQL Server Management Studio yardımı ile oluşturulabilinmesi mümkündür. Bunun için Security tabı içerisinde yer alan Logins klasörünün üzerine sağ tıklama yaptıktan sonra New login... seçeneğine tıklanması ile bu işlem başlanmış olunacaktır.


Bu seçeneğe tıkladıktan sonra karşımıza çıkan ekrandan aspnet_roles ve aspnet_membership şemalarını oluşturmuş olduğumuz ya da var olan bir kullanıcıya atayarak kullanılabilmesine olanak tanıyoruz.



Bu işlem sonrasında kendi kullanıcımıza da gerekli rol ve kullanıcı oluşturma,değiştirme ve silme yetkisi tanımlamış oluyoruz.

Bu yazımızda ASP.NET MVC uygulamalarında güvenlik amacı ile sayfalar arası kimlik denetimi sağlanabilmesi için kullanıcı ve rol oluşturduktan sonra bu bilgileri [Authorize] özniteliği yardımı ile nasıl kullanabileceğimizi incelemeye çalıştık.

Umarım yararlı olabilmiştir.

Çarşamba, Eylül 30, 2009

Asp.Net MVC Framework - OutputCache Kullanımı ve Dinamik İçerik Görüntüleme

Asp.Net MVC Framework ile geliştirilen uygulamaların performanslarının arttırılması için bir ön bellekleme kullanılması en çok tercih edilen yöntemlerden biridir. Web sayfalarının görüntülenmesi esnasında benzer veriler görüntülenecekse bu sayfaların önbellekte tutulması sayfa görüntüleme performansını arttıracak. Ana sayfada görüntülenen bir veriyi önbellekleme kullanarak diğer kullanıcılar içinde hızlıca açılabilmesine olanak tanırız. Bu konu hakkında kafanıza takılan konular var ise OutputCache Kullanımı ve Performans başlıklı bir önceki yazımızı okuyabilirsiniz.

Ön bellek kullanarak benzer verileri bellekte tutulması yöntemi ile bir çok kullanıcıya hızlı bir şekilde gösterebiliriz. Evet performans açısında başarılı bir çözüm ancak bu kullanımda kesinlikle dikkat edilmesi gereken bir nokta var. Web sayfası üzerinde yer alan dinamik içerikler. Bu tür sayfalarda 4-5 adet reklam rastgele bir şekilde sayfayı açan kullanıcılara gösterilecektir. Eğer ki bizler bütün sayfayı önbelleğe aldırırsak sayfa her yenilendiğinde kullanıcı aynı reklamı görmeye devam edecektir. Bu durumda web sitelerinin reklamlar üzerinden gelir elde ettiğini düşünürsek hiçte istenen bir durum olmadığı gözlenir. Çünkü siteler parayı yalnızca açılmış olan tek reklam üzerinde alacaklardır ki kullanıcılar da bir kez tıkladığı reklamı ikinci kez tıklamama ihtimali oldukça yüksektir.

Bu noktada MVC ile uygulama geliştirmek istiyoruz ancak reklamda kullanmak istiyoruz. Ayrıca uygulamanın performansının da hızlı olması için önbellekte kullanılması gerektiğini gözlemliyoruz. Peki, yapılabilecek bir işlem yok mu? Neyse ki bu sorunun çözümü oldukça basittir. Asp.Net Framework 'ü içerisinde yer alan post-cache substitution 'ı çağırmak yeterli olacaktır.

Not: Normal durumda OutputCache özniteliği yardımı ile sayfalar hem sunucu hem de son kullanıcının bilgisayarında yer alan internet tarayıcısında önbelleğe alınabiliyor. Değişken bir içerik kullanılacaksa (banner reklamlar gibi) post-cache substitution kullanımı ile sayfanın o bölümü sunucu üzerinde önbelleğe alınarak kullanılır.

Post-Cache Substitution Kullanımı

Post-Cache Substitution kullanımını iki adımda tamamlanabilinmesi mümkündür. Birinci adım, geri dönüş değeri string olan bir metot hazırlayarak dinamik içeriğin görüntülenecek olduğu önbelleğe alınacak olan bir sayfa oluşturmak olacaktır. Daha sonraki adımda ise dinamik içeriğin görüntüleneceği sayfaya HttpResponse.WriteSubstitution() metodunu kullanabilmek için ekliyoruz.

Bahsettiğimiz bu konuları bir örnek ile pekiştirmek gerekirse, ekran üzerinde rastgele veri gösteren değerleri önbelleğe alınacak dinamik bir web sayfası oluşturalım. Bu işlem için basitçe RenderNews() isimli bir metot oluşturalım. Geri dönüş olarak stringlist in içerisinde yer alan değerleri rastgele olarak göstersin.

Models\News.cs
using System;
using System.Collections.Generic;
using System.Web;

namespace DynamicContentCache.Models
{
    public class News
    {
        public static string RenderNews(HttpContext context)
        {
            var news = new List<string>
            {
                "Dünya 1",
                "Dünya 2",
                "Dünya 3"
            };

            var random = new Random();
            return new string[random.Next(news.Count)];
        }
    }
}

Model içerisine oluşturulan verileri view içerisinde oluşturacak olduğumuz sayfa içerisinde göstereceğiz. Bu sayfa içerisinde HttpResponse.Substitution() metodundan yararlanarak önbelleğe alınmış sayfa içerisinde dinamik içeriğin rastgele olarak görüntülenebilmesine olanak tanınacaktır.

Post-cache substitution yöntemini kullanabilmek için HttpResponse.WriteSubstitution() metodunu kullanıyor olacağız. Bunun için view sayfa içerisinde dinamik olarak değiştirilmesi istenilen değerler bu metot içerisine eklenilerek kullanılır.

Views\Home\Index.aspx
<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<IEnumerable<DynamicContentCache.Models.News>>" %>
<%@ Import Namespace="DynamicContentCache.Models" %>

<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
    Index
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
    <div>
        <% Response.WriteSubstitution(News.RenderNews); %>
        <hr />
             OutputCache içeriği
             <%= DateTime.Now %>
    </div>
</asp:Content>

WriteSubstitution() metodundan yararlanarak RenderNews() içerisinde yer alan değerleri her yenileme esnasında rastgele olarak getirilmesini sağlamaktadır.

Controller katmanında yer alan Home Controller sınıfının içerisindeki Index() Action unda da sayfa üzerinde gösterilecek olan değerlerin herhangi bir parametre almadan 60 saniyede bir önbelleğe alınmasını sağlayacak şekilde gerekli değişiklikleri yapıyoruz. Bir önceki yazımızda da değindiğimiz gibi önbelleğe alma işlemlerini [OutputCache] özniteliğini kullanarak yapabildiğimizi detaylı bir şekilde incelemiştik.

Controllers\HomeController.cs
using System.Web.Mvc;

namespace DynamicContentCache.Controllers
{
    [HandleError]
    public class HomeController : Controller
    {
        [OutputCache(Duration=60, VaryByParam="none")]
        public ActionResult Index()
        {
            return View();
        }
    }
}

HomeController içerisinde yer alan Index() 'in içerisinde yer alacak olan verilerin ön belleğe alınmasını sağlamış durumdayız. Bu işlemler sonrasında Index.aspx sayfasının içerisinde yer alan değerler bir dakika boyunca önbellekte kalmaya devam edecektir. Ancak dinamik içeriklerin değişmesi istemiştik. WriteSubstitution() metodu sayesinde web sayfası önbelleğe alınmış olmamıza rağmen sorunsuzca dinamik verilerin güncellendiğini gözlemleyeceğiz. Yapmış olduğumuz işlemler sonrasında karşımıza çıkan ekran görüntüsü aşağıdaki gibi olacaktır.



Web sayfası görüntülenirken sayfayı her yenilediğimizde önbelleğe alınan kısım bir dakika boyunca sabit kalırken dinamik olarak değişmesini istediğimiz değer de sorunsuzca kendisini yenileme işlemini gerçekleştirmektedir.

Post-Cache Substitutionu Helper Metot içerisinde Kullanmak

WriteSubstitution() metodunu view sayfaların içerisinde kullanabilmekle birlikte bizlerin hazırlamış olduğu harici HTML Helper metotlar yardımı ile de kullanılabilmesi mümkündür. Bunun için projemize bir adet AdHelper.cs isimli helper sınıfı ekliyoruz ve aşağıdaki işlemleri uyguluyoruz.

Not: HTML Helper metotların nasıl oluşturulacağı konusunda yeterince bilgiye sahip olduğunuza inanmıyorsanız daha önceden yayınlanmış olan yazılarımızı okuyarak bu eksiğinizi tamamlayabilirsiniz.

Helpers\AdHelper.cs
using System;
using System.Collections.Generic;
using System.Web;
using System.Web.Mvc;

namespace DynamicContentCache.Helpers
{
    public static class AdHelper
    {
        public static void RenderBanner(this HtmlHelper helper)
        {
            var context = helper.ViewContext.HttpContext;
            context.Response.WriteSubstitution(RenderBannerInternal);
        }

        private static string RenderBannerInternal(HttpContext context)
        {
            var img = new List<string>
            {
                "images/tuural.jpg",
                "images/turhal.jpg"
            };

            var random = new Random();
            var ad = img[random.Next(img.Count)];
            return String.Format("<img src='{0}' />", ad);
        }
    }
}

Statik olarak iki tane metot oluşturuyoruz. Bunlar, RenderBanner() ve RenderBannerInternal() 'dir. Helper metot olarak kullanılacak olan RenderBanner() 'ı hazırken WriteSubstitution 'nun callback yapacak olduğu değerileri alabilmesini sağlayan RenderBannerInternal() dir. Asp.Net MVC HtmlHelper sınıfından yararlanarak view sayfalarda Html.RenderView() şeklinde kullanılmasına olanak tanımış oluyoruz.

RenderView() metodu çağırıldığında HttpResponse.WriteSubstitution() metodu doğrulayarak RenderViewInternal() metodunu kullanacaktır. Ayrıca private bu metot içerisinde rastgele olarak seçilen banner resimlerin görüntülenmesi için gerekli işlemler sağlanmaktadır. Biraz önce yazılar için yapmış olduğumuz dinamik içeriklerin güncellenmesi işlemini şimdi de resimler için hazırlamış olduk.

Tekrardan kısaca oluşturulan harici HtmlHelper ları nasıl view sayfalarda görüntüleyeceğimizi hatırlayalım. İlk olarak yapılması gereken oluşturulmuş olan Helpers sınıfını web sayfasına <% import%> şeklinde eklemek olacaktır. Sonrasında ise helpers sınıfı içerisinde yer alan metotlardan HtmlHelper 'a göre oluşturulmuş olanlar biz web sayfasında <% Html. %> şeklinde bir kullanım esnasında otomatik tamamlama ekranında çıkacaktır. Sonrasında ise tek yapmamız gereken kendi Helper Metodunuzu projenizde kullanmak olacaktır. Bu ön bilgi sonrasında biraz önce oluşturulmuş olan Index.aspx sayfasını aşağıdaki biçimde güncelliyoruz.

Views\Home\Index.aspx
<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<IEnumerable<DynamicContentCache.Models.News>>" %>
<%@ Import Namespace="DynamicContentCache.Models" %>
<%@ Import Namespace="DynamicContentCache.Helpers" %>

<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
    Index
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
    <div>
       
<% Response.WriteSubstitution(News.RenderNews); %>
       <hr />
        <% Html.RenderBanner(); %>
        <hr />
             OutputCache içeriği
             <%= DateTime.Now %>
    </div>
</asp:Content>

Yapmış olduğumuz değişiklikler sonrasında Index.aspx sayfasına Html.RenderView() helper ini çalışacak şekilde ekledik ve uygulamayı hazır hale getirdik. Artık web sayfalarında gösterecek olduğumuz reklamları ve diğer aklımıza gelmeyen öğeleri önbelleğe alınmış olan sayfalarda dinamik içerik olarak oluşturabilir duruma getiriyoruz. Uygulamanın çalışması sonrasında aşağıdaki gibi bir ekran görüntüsüne sahip olacaktır.



Sonuç gayet başarılı... Her yenileme sonrasında zamanı gösteren değer sabit kalırken resim ve üstündeki yazı bizim belirttiğimiz gibi rastgele olarak değişmektedir.

Geldik bir yazımızın daha sonuna. Bu yazımızda önbelleğe alınmış olan sayfalarda yer alan verilerin belirli bir zaman aralığı boyunca yenilenemeyeceği ana fikrinden yola çıkarak dinamik olarak değişecek bir içeriğin bu sayfalar içerisinde nasıl kullanılacağını detaylı bir şekilde incelemeye çalıştık.

Umarım yararlı olabilmiştir.

Pazar, Eylül 06, 2009

Asp.Net MVC Framework - Validation İşlemleri - II

Günler geçtikçe ASP.NET MVC Framework hem ülkemizde hem de dünyada yayılmaya devam etmektedir. Geliştirdiğimiz web projelerinin geliştiriciler tarafında hızlı geliştirilebilmesine sağladığı olanaklar ve çalışma zamanındaki performansı ile tercih sebebi olma yolunda emin adımlarla ilerlemektedir. Ayrıca MVC kalıbını yıllardır web kullanıcıları kullanıyordu. Ancak ASP.NET MVC Framework ile birlikte gelen hazır özelliklerin bir çoğunu kendimiz oluşturmak durumunda kalıyorduk. Bu da bize MVC Framework ile geliştirdiğimiz uygulamaların geliştirilebilirliğinin daha da kolay olduğunun ufak bir göstergesidir.

ASP.NET MVC Framework ile yapılabilecekleri ufak örnekler yardımı ile bir süredir inceliyoruz. Bu sefer ise bir önceki yazımızda incelemiş olduğumuz Validation kontrollerini devam yazısı ile incelemeye devam ediyoruz. Bu yazımızda ModelState.AddModelError() ile yapmış olduğumuz hata kontrolünü kendi hazırlayacak olduğumuz sınıf yardımı ile nasıl yapabileceğimizi incelemeye çalışacağız.

Validation kontrolünü yine bir örnek ile inceleyelim ve veri tabanında ders tablosu oluşturalım.

mak60_1
Tabloyu oluşturduktan sonra bir MVC projesi oluşturacağız. Sonrasında ise projeye Entity Framework özelliklerinden yararlanmak için Entity Data Model ekleyeceğiz.

mak60_2
Not: Entity Model ile çalışırken unutulmaması gereken en önemli noktalardan biri model üzerine eklemiş olduğumuz tablo objelerinin isimlerinin veri tabanı ile aynı olmamasıdır. Bu sebepte veri modeline attıktan sonra ismini değiştiriyoruz. Bu açıkladığımız konuları uygularken zorluk yaşıyorsanız daha önce yayınlamış olan ilişkisel yazıları okuyabilirsiniz.

Temel işlemleri yapmaya devam ediyoruz. Diğer yazılarımızda da sıklıkça değindiğimiz verilerin getirilmesi ve yeni bir kayıt oluşturulması durumunda gerçekleşecek işlemleri sağlayacak metotları hazırlayalım. İş katmanı Controller olduğuna göre ve bu işleri ana sayfa üzerinde hazırlayacağımıza göre HomeController içerisinde bahsettiğimiz işlemleri gerçekleştiriyoruz.

using System.Linq;
using System.Web.Mvc;
using ValidationIslemler.Models;

namespace ValidationIslemler.Controllers
{
    [HandleError]
    public class HomeController : Controller
    {
        private MVCArticleEntities _db = new MVCArticleEntities();
        public ActionResult Index()
        {
            return View(_db.OgretimUyesSet.ToList());
        }

        public ActionResult Create()
        {
            return View();
        }

        [AcceptVerbs(HttpVerbs.Post)]
        public ActionResult Create([Bind(Exclude = "id")] OgretimUyes yeniOgretimUyesiEkle)
        {
            if (!ModelState.IsValid)
                return View();

            try
            {
                _db.AddToOgretimUyesSet(yeniOgretimUyesiEkle);
                _db.SaveChanges();

                return RedirectToAction("Index");
            }
            catch
            {
                return View();
            }
        }

        public ActionResult About()
        {
            return View();
        }
    }
}

Daha önceki yazılarımızda Create metodunu otomatik olarak oluşturur ve içerisinde yazılması gereken işlemleri bizler doldururduk. Fakat bu işlemi direk bizde yapabiliriz. Yeni kayıt işleminin gerçekleşebilmesi için iki adet create metoduna ihtiyaç vardır. Birincisi create edilecek değer bulunamazsa geldiği view 'a döndürür. Bir diğeri ise Create işlemini gerçekleştiren bölümdür. Dikkat edeceğiniz üzere ikinci Create metodunda gelen verinin modele uyumluluğunu da kontrol ediyoruz. Bu durumda ilk Validation kontrolünü gerçekleştirmiş oluyoruz. Bu kontrol esnasında ModelState değeri negatif dönerse yeni kayıt oluştur linkine tıklanan sayfaya geri dönecektir. Ayrıca bu durumda hataya düşüyorsanız elle ya da otomatik olarak oluşturmuş olduğunuz HTML sayfanın Model 'den veri aldığına emin olarak işlemlerinizi gerçekleştirebilirsiniz.

Yazımızın başında da bahsetmiştik, model üzerinde veri kontrollerini yapmak için gerekli işlemleri nasıl oluşturacağımızı inceliyor olacaktık. Bu aşamada ilk olarak projeye eklemiş olduğumuz Ado.Net Entity Model 'in design tarafında otomatik olarak oluşturulmuş olan cs koda göz atalım.

mak60_3

Gördüğümüz kadarı ile model içerisinde erişebildiğimiz sınıflar partial class olarak tanımlanmaktadır. Peki, "partial class neydi?" kısaca hatırlamak gerekirse;

Partial classların ne olduğunu kısaca hatırlamak gerekirse; fiziksel olarak yada aynı fiziksel dosyada (amacına göre ayrı iki .cs dosyasında olması makbul ve mantıklıdır) tanımlanan class tanımlarının tek bir class olarak çalışması ve derlenmesidir. Yani aslında bir sınıfın metotların farklı .cs dosyalarında tanımlayabilmeyi sağlar.

Bu durumda IDataErrorInfo ara yüzünü kullanabileceğimiz sınıfı partial olarak oluşturup içeriğini düzenleyeceğimiz duruma getiriyoruz. Model katmanının içerisine yeni bir sınıf ekliyoruz.

Models\OgretimUyesi.cs
using System.Collections.Generic;
using System.ComponentModel;

namespace ValidationIslemler.Models
{
    public partial class OgretimUyesi
    {

    }
}

Entity Framework ile hazırlanmış olan data modelde partial sınıflar otomatik olarak oluşturulmaktadır. Entity Framework ile oluşturulan kodlarda otomatik olarak OnChanging ve OnChanged partial sınıfları oluşturulur.

Şimdi bizde oluşturmuş olduğumuz sınıfın içerisine Aşağıdaki metotları ekleyelim.

•OnIdChanging
•OnIdChanged
•OnAkademisyenChanging
•OnAkademisyenChanged
•OnUnvanChanging
•OnUnvanChanged
•OnDersSaatiChanging
•OnDersSaatiChange

OnChanging metotları OnChanged metotlarını tetikleyerek çalışır ve güncelleme işlemlerinde ID özelliklerinden yararlanarak bizim istediğimiz değişiklikleri yapamabilmemize olanak tanır.

Şimdi yukarıdaki bilgilerimizden yararlanarak eklemiş olduğumuz partial sınıfı biraz düzenleyelim. Yapacak olduğumuz değişiklikler ile son kullanıcının web form üzerinden Akademisyen ve Unvan bilgilerini boş girmemesi için gerekli olan kod parçasını oluşturalım.

Yazımızın içerisinde daha öncede bahsettiğimiz gibi Validation işlemlerini yaptığımız durumlarda IDataErrorInfo ara yüzünün özelliklerinden yararlanarak çok daha işlevsel bir hata kontrolü yapabilmemiz mümkündür.

using System.Collections.Generic;
using System.ComponentModel;

namespace ValidationIslemler.Models
{
    public partial class OgretimUyesi:IDataErrorInfo
    {
        private Dictionary<string, string> _errors = new Dictionary<string, string>();

        partial void OnAkademisyenChanging(string value)
        {
            if (value.Trim().Length == 0)
                _errors.Add("Akademisyen", "Akademisyen bilgisi boş geçilemez.");
        }

        partial void OnUnvanChanging(string value)
        {
            if (value.Trim().Length == 0)
                _errors.Add("Unvan", "Unvan bilgisi boş geçilemez.");
        }
    }
}

Yapmış olduğumuz işlem sonrasında örneğin akademisyen bilgisi boş geçildiğinden _errors Dictionary<> 'sine hata mesajı yazılacak ve kullanıcıya gösterilecektir.

IDataErrorInfo ara yüzü ile oluşturmuş olduğumuz sınıfı birlikte kullanmamız da gerekmektedir. Zaten OgretimUyesi sınıfına ara yüzü eklediğimiz zaman bize otomatik olarak aşadağıki metotları getirmektedir. Bakalım IDataErrorInfo ara yüzünün içerisinde hangi metotlar yer almaktaymış.

public interface IDataErrorInfo
{
    string this[string columnName] { get; }

    string Error { get; }
}

HomeController içerisinde oluşturmuş olduğumuz Crete() kontrolüne ilişkin kontrolleri üzerinde değişiklik yaptığımız OgretimUyesi.cs üzerinde IDataErrorInfo ara yüzünden yararlanarak Validation kontrolleri işlemlerini gerçekleştirdik.

OgretimUyesi sınıfının içerisinde eğer Akademisyen ve Unvan alanları boş geçilirse verilecek olan hata belirtilmiştir. Boş geçilmesi durumunda kolon adını kontrol edecek olan IDataErrorInfo ara yüzü olacaktır. Bu durumda ara yüze ilişkin özelliklerden error 'a istediğimiz kontrol sonucunda hata oluşursa son kullanıcının sayfasında görüntülenmesine olanak tanırız. Ayrıca hata olması sonucunda geri dönüş değeri olarak boş string döndürelim.

Şimdi yukarıda açıklamış olduğumuz özelliklere göre IDataErrorInfo ara yüzü ile ilişkilendirelim ve özelliklerine gerekli değerleri atayalım.

using System.Collections.Generic;
using System.ComponentModel;

namespace ValidationIslemler.Models
{
    public partial class OgretimUyesi : IDataErrorInfo
    {
        private Dictionary<string, string> _errors = new Dictionary<string, string>();

        partial void OnAkademisyenChanging(string value)
        {
            if (value.Trim().Length == 0)
                _errors.Add("Akademisyen", "Akademisyen bilgisi boş geçilemez.");
        }

        partial void OnUnvanChanging(string value)
        {
            if (value.Trim().Length == 0)
                _errors.Add("Unvan", "Unvan bilgisi boş geçilemez.");
        }

        #region IDataErrorInfo Members

        public string Error
        {
            get { return string.Empty; }
        }

        public string this[string columnName]
        {
            get
            {
                if (_errors.ContainsKey(columnName))
                    return _errors[columnName];
                return string.Empty;
            }
        }

        #endregion
    }
}

Artık özellikler sonrasında boş geçilen değerler _errors koleksiyonuna eklecek ve son kullanıcı sayfasında gösterilecektir.

Bu arada yazımız boyunca yaptığımız bütün işlemleri OgretimUyesi sınıfının içerisinde yaptığımızı ve HomeController sınıfında hiç bir değişiklik yaptığımızı unutmayalım.

Sonuç olarak neler yaptığımızı tekrardan bir üstünden geçmek gerekirse, IDataErrorInfo ara yüzü yardımı ile otomatik olarak gösterilen kontrol mesajlarını nasıl oluşturabileceğimize göz attık. Daha sonrasında ise OnAkademisyenChanging() ve OnUnvanChanging partial metotlarını OgretimUyesi sınıfına ekledik. Bu eklediğimiz metotlar yardımı ile Asp.Net MVC Framework uygulamalarında kendimize özgü Validation mesajlarını nasıl gösterebileceğimizi öğrenmiş olduk.

Umarım yararlı olabilmiştir.

Turhal Temizer
info@turhaltemizer.com

Çarşamba, Temmuz 15, 2009

Asp.Net MVC Framework - Validation İşlemleri - I

Asp.Net ile geliştirdiğimiz uygulamalarda kullanıcı bazlı olarak işlem yaptırmak istediğimizde verilen doğru olarak girilip girilmediğini kontrol etmemiz gerekmektedir. Örneğin böyle bir kontrol yapmadığımızda kişiler kimlik numarasını girmek yerine adını da yazabilmektedir. Bu istenmeyen bir durumdur. Kimlik numarası 11 haneden oluşmakta ve yalnızca rakamlardan oluşmaktadır ki harf girilmesi istenmeyen durumlar arasında gösterilmektedir. Peki bu kontrolü yapmak için nasıl işlemler uygulamamız gerekmekte kısaca bir hatırlayalım. Klasik yöntemlerden birincisi sayfamızın markup kod tarafında Java Script ile hazırlanmış kontrolleri ekleyerek kullanabiliriz. Bir diğer seçeneğimiz *.cs veya *.vb kod tarafında hazırlamış olduğumuz manüel kontroller yardımı ile bu durumu engelleyebilme şansımız vardır. Fakat bu yöntemin çalışması için internet sayfasının en az bir kez server ile haberleşmesi ve yeniden yüklenmesi gerekmektedir ki bu da web sitesinin hızlılığı açısından istenmeyen bir durumdur. Son ve en sık kullanılan özellik ise Asp.Net Validation kontrollerinin kullanılmasıdır. Bu yöntem oldukça başarılı ve bizim kullanmış olduğumuz kontrol üzerindeki işlemimiz tamamlandığı anda kendisini aktifleştiren bir yöntemdir.

Yukarıdaki paragrafta yer alan özelliklerin hepsini okuduktan sonra her şey çok güzel o zaman ben işlemimi Asp.Net Validation kontrolleri yardımı ile gerçekleştireyim şeklinde aklınıza çözüm gelebilir. Evet yapabiliriz. Fakat bizim ana amacımız hazırlanan internet sayfalarınız daha performanslı bir şekilde açılabilmesi olduğu için Validation kontrolleri yerine başka bir kontrol kullanalım. Fakat unutmayalım ki MVC Framework ile hazırlamış olduğumuz uygulamalarda Asp.Net kontrolleri kullanılması mümkündür. Ama biz controller tarafında hazırlayacak olduğumuz işlemler yardımı ile Validation kontrollerini kullanmak istiyoruz. Çünkü bizler web sayfasının markup kodunda asp kontrolleri yerine Html.* şeklinde HTML içeriklerini kullanmak istemekteyiz. Bu yazımız boyunca bu işlemleri nasıl yapabileceğimize detaylı bir şekilde incelemeye çalışıyoruz olacağız.

Validation işlemlerimizi yapabilmemiz için Model kavramını incelerken kullanmış olduğumuz proje üzerinde değişiklikler yaparak başlıyoruz. İlk olarak veri tabanımıza Dukkan isimli bir tablo daha ekliyoruz ve alanları olarak;
• Id
• Name
• Description
• UnitPrice
• Stock
belirledikten sonra Entity modele ekleme işlemini gerçekleştirebilmek için *.edmx ara yüzünün üzerinde sağ tıklama yaptıktan sonra Update Model from Database seçeneğine tıklayarak yeni bir tablo ekleyebileceğimiz ekrana geliyoruz.



Karşımıza gelen ekranda Tables seçeneğinden yeni eklemek istediğimiz tabloyu seçtikten sonra tamam seçeneğine basarak Entity modelinin içeriğindeki tablo sayısını arttırıyoruz. Ayrıca daha önceki yazılarımızda değinmiş olmamıza karşın tekrardan hatırlamak gerekirse, Entity Model 'in içerisine tablo,view ve store prodecure (sp) ekleyebilmemiz mümkündür.



Eklemiş olduğumuz tablo entity modelde gözükmüştür. Bu tabloya ilişkin işlemleri yapabilmemiz için projeye bir tane Controller sınıfı ekliyoruz. İçeriğinde ilk olarak tablo içerisinde yer alan verilerin gözükmesi için index() metodunu dolduruyoruz. Sonrasında da herhangi bir veri yoksa yeni bir kayıt ekleme işlemini yapacağız. Bu noktada dikkat edeceğimiz yer başlamaktadır. Yazımızın başlarında Validation işlemlerini açıklarken en sık kullanım yerinin başında son kullanıcıya veri ekleme izni verilen yerlerde olduğundan bahsetmiştik. İşte bizde bu controller içerisinde yeni bir kayıt eklemek istediğimiz durumda Validation işlemlerini nasıl uygulayabileceğimize göz atacağız. Bunun için Create metodunda aşağıdaki eklemeleri ve düzenlemeleri yapıyoruz.

Controller\ProductController.cs
public ActionResult Create()
{
    return View();
}

//
// POST: /Product/Create

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Create([Bind(Exclude="Id")] Dukkans dukkansToCreate)
{

    //Kontrollerin yapıldığı kısımdır.
    if (dukkansToCreate.Name.Trim().Length == 0)
        ModelState.AddModelError("Name", "İsim degeri bos gecilemez...");
    if (dukkansToCreate.Description.Trim().Length == 0)
        ModelState.AddModelError("Description", "Aciklama degerleri bos gecilemez");
    if(dukkansToCreate.UnitStock<0)
        ModelState.AddModelError("UnitPrice","UnitPrice degeri 0 dan az olamaz...");
    if (ModelState.IsValid)
    return Create();
    try
    {
        // TODO: Add insert logic here
        _db.AddToDukkansSet(dukkansToCreate);
        _db.SaveChanges();
        return RedirectToAction("Index");
    }
    catch
    {
        return View();
    }
}

Entity Model 'de yer alan veri tabanı tablosuna ilişkin elemanları tek tek değer kontrolü ettikten sonra bizim belirtmiş olduğumuz özellikler kriterleri kullanıcının girmiş olduğu veriler geçemezse ModelState.AddModelError() ile işlem yapılacak alan için istenilen mesaj verilebilir duruma gelinmiştir. Peki, "bizler hiç kontrol eklemezse varsayılan olarak yaptığı kontroller var mıdır?" şeklinde aklınıza bir soru takılabilir. Cevabı ise, evet vardır. Veri tabanı üzerindeyken tablonuzu oluşturma esnasında alanlardan boş geçilemez olarak tanımlamış olduğunuz alanlarda varsayılan olarak kontrol yapılmaktadır ve yapılan kontrol verilerin girilip girilmediği kontrolüdür.

MVC uygulamalarında kullanıcıların göreceği katmana View denilmekteydi ve bu sayfaları controller da oluşturulmuş olan metotlar yardımı ile basitçe oluşturabiliyorduk. Şimdi tekrardan kısaca bu işleme göz atmak gerekirse,

İlk olarak oluşturmuş olduğumuz metodun üzerine geliyoruz ve sağ tıklama sonrası addView seçeneğine tıklıyoruz.



Bir sonraki adımda karşımıza gelen ekranda Oluşturmak istediğimiz View 'ın adını (eğer vermezsek varsayılan olarak metodun adını alacaktır) ne tür işlem yapacağımızı ve veri sınıfının ne olacağını sormaktadır. Veri sınıfı bölümünde model isim alanı içerisinde yer alan nesnelerden tablomuzun isminin olduğu seçeneği seçmemiz durumunda yapmak istediğimiz işlemler sorunsuzca çalışacaktır. Aksi durumda çalışma anında hata ile karşılacaksınız.



Yaptığımız işlemler sonrasında view sayfasını oluşturmuş bulunuyoruz. Artık bu sayfanın içeriğini inceleyebiliriz.

View\Product\Create.aspx
<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<FilmUygulama.Models.Dukkans>" %>

<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
    Create
</asp:Content>

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">

<h2>Create</h2>

<%= Html.ValidationSummary("Create was unsuccessful. Please correct the errors and try again.") %>

<% using (Html.BeginForm()) {%>

    <fieldset>
        <legend>Fields</legend>
        <p>
            <label for="Id">Id:</label>
            <%= Html.TextBox("Id") %>
            <%= Html.ValidationMessage("Id", "*") %>
        </p>
        <p>
            <label for="Name">Name:</label>
            <%= Html.TextBox("Name") %>
            <%= Html.ValidationMessage("Name", "*") %>
        </p>
        <p>
            <label for="Description">Description:</label>
            <%= Html.TextBox("Description") %>
            <%= Html.ValidationMessage("Description", "*") %>
        </p>
        <p>
            <label for="Price">Price:</label>
            <%= Html.TextBox("Price") %>
            <%= Html.ValidationMessage("Price", "*") %>
        </p>
        <p>
            <label for="UnitStock">UnitStock:</label>
            <%= Html.TextBox("UnitStock") %>
            <%= Html.ValidationMessage("UnitStock", "*") %>
        </p>
        <p>
            <input type="submit" value="Create" />
        </p>
    </fieldset>

<% } %>

    <div>
        <%=Html.ActionLink("Back to List", "Index") %>
    </div>

</asp:Content>dasda

HTML elementinin özelliklerinden ValidationMessage() ile kullanıcıların veri girişinde yapmış oldukları hataları gösterebilmemize olanak tanımaktadır. Gerekli kontrolleri hatırlayacağınız üzere ProductController sınıfının içerisinde yer alan Create metodunun içerisinde yapılmıştı. Sizler index() metodunun dışında yer alan sayfaları da oluşturarak uygulamanızı daha da kullanışlı bir biçime getirebilmeniz mümkündür. Eğer bu işlemler esnasında herhangi bir zorluk yaşıyorsanız Asp.Net MVC Framework ile ilgili geçmiş yazıları okuyarak eksiklerinizi tamamlayabilirsiniz. Gerekli sayfaları oluşturduk ve web sayfasını çalıştırıyoruz.



Adres çubuğuna dikkat edersek, oluşturulan controller in adına göre view katmanına alt klasörler oluşturuldu ve o klasörün içerisinde oluşturulmuş olan index sayfası çağırıldı. Fakat tablomuzda hiç bir kayıt olmadığı için karşımıza sadece tablo alanlarının isimleri gelmektedir.



Gördüğünüz üzere ProductController sınıfında Create() metodunda kullanılacak değerler için eklemiş olduğumuz bütün Validation kontrolleri gerçekleşmiştir. Çok ufak bir hatırlatma yapmak gerekirse, Create() metodunda [Bind(Exclude="")] kullanım şekli veri tabanından ya da başka bir yerden otomatik olarak eklenecek olan verileri belirtmektedir. Bu bize belirtilen alan için değer bekleme eğer ki alan view sayfa üzerinde kaldırılmadıysa dahi girilen değeri görmeden işlemleri yapmaya devam et anlamına gelmektedir.

Yazımızda değinmiş olduğumuz konulara kısaca bir göz atmak gerekirse; İlk olarak Validation işlemlerinin hangi durumlarda, nasıl ve hangi amaçlarla kullanıldığını açıklamaya çalıştık. Bir sonraki adımımızda bir proje oluşturarak tablomuzu Entity Data model 'e ekleyerek proje içerisinde kullanılabilir bir duruma getirdikten sonra tablo için gerekli olan controller sınıf oluşturuldu. MVC Framework ile hazırlanmış olan web uygulamalarında Validation işlemlerini kullanmak istediğimizde Controller sınıflarının içerisinde yapmamız gerektiğini ve ModelState.AddModelError() özelliğini kullanmamız gerektiğine göz attık. Daha sonra oluşturmuş olduğumuz metodun view sayfasını nasıl oluşturabileceğimizi tekrardan hatırlayarak Create sayfasını oluşturduk. Markup kod tarafına otomatik olarak eklenen kodları incelediğimiz de gözümüze HTML elementinin bir başka özelliği çarpmaktadır ki bu özellik bizim uygulamak istediğimiz Validation işlemlerinde en çok yarayan '*' 'ı koymaktadır. HTML.ValidationMessage() özelliği ile de hatalı girilen bileşenlerin yanına kırmızı bir * koyarak daha da belirgin olabilmesine olanak tanımaktadır. En son olarak da yaptığımız işlemleri internet tarayıcında kontrol ederek işlemlerimizi tamamladık.

Umarım yararlı olabilmiştir.

Turhal Temizer
info@turhaltemizer.com