This add-in project converts c# and vb.net codes in visual studio. Sometimes we need to convert code between c# and vb.net but convertion progress is very boring. Open the web browser, google it(c# to vb.net) and using some online code convertion service and oh, code is converted. Thats really boring and difficult way.
What does CodeCopy do?
CodeCopy is simple way to code convertion between c# and vb.net languages. You can copy any c# or vb.net code and paste visual studio whit Paste with CodeCopy. Thats detect your project language and converts code to target language(c# or vb.net). It's simple!
Works on Visual Studio 2005, 2008 and 2010.
Feature plan
- Partial code converting: Converter runs on code blocks and covert code and comment code block when it is non convertable block. Notice convertable code blocks will be recover.
- Smart error fixer: We work on generic errors because some error messages fixed programmaticaly. Eg: if error is "',' expected." then we fix this problem when inserted ',' character on required line and column.
- More effective code convertion
More...
2466f189-b6d6-492c-9cef-4002fb5bf08f|4|4.5

Merhabalar, bir önceki yazımda da belirttiğim gibi c# ve vb.net arası otomatik kod dönüşümü sağlayacak bir eklenti geliştirdik. Talep yönünde geliştirme işlemine devam edeceğiz. Özetle eklenti kopyala yapıştır gibi basit bir işlemle proje diline dönüştürülüyor ve kullanıma hazır olmuş oluyor. Şimdilik bu kadar bilgi vermekle yetiniyorum. Projeyi codecopy.codeplex.com adresinden takip edebilir yada indirip deneyebilirsiniz.
Kaynak kodları indirin
Eklentiyi indirin(Kurulum dosyası)
4b330312-3931-4565-8a08-bb63a091b821|0|.0
Bilindiği üzere tüm veritabanlarının veri sorgulamak için birbirlerine benzer sorgulama dili vardır(Mssql için T-SQL, oracle için PL-SQL gibi). Hibernate ortamında veritabanından bağımsız düşünüldüğü için bu sorgulama dilleri arasındaki farklılığı ortadan kaldırmak amacıyla hibernate yapısal sorgulama dili(Hibernate Query Language) kullanılmaktadır. Hibernate yazılan HQL'i değerlendirip kullanılan veritabanına uygun dile dünüştürerek kullanır. Bu nedenle eğer HQL kullanarak daha esnek bir şekilde sorgulama yapmak istiyorsak bu dili öğrenmek icab ediyor. Aynı işlevi Criteria kullarak da belirtebiliyoruz. Ancak bu başka bir yazı konusudur. Bu yazıda HQL'in temel işlevlerini değerlendiriyor olacağım.
More...
5acb0a9d-84ba-4328-8b44-a4cf3efdd4b5|2|2.5
Merhabalar, NHibernate ile geliştirilen uygulamalarda veritabanından bağımsız çalışma yani herhangi bir veritabanına özel tipleri kullanamama durumundan dolayı özel tipler tanımlama gereği duyulmaktadır. Bu örneği daha iyi açıklayabilmek için Enumaration tipli alanların kullanımında yaşanan problem ve problemin çözümü hakkında bahsederek yazıya devam etmeyi uygun görüyorum.
Daha önceki yazılarda bir sınıfın Map edilme işlemine yönelik anlatımları gerçekleştirdim. Tabiki bazı özel durumlardan hemen bahsetmek uygun değildi. İlerledikce istisna durumları incelemek ve anlamak daha da kolaylaşıyor olacaktır.
Herşeyden önce Fluent NHibernate ile herhangi bir veritabanını kullanıldığı düşünülerek çalışılmalıdır. Yazacağımız kodun tamamı nesneye yönelik olması gerektiğinden nesne yönelimli kodlama önemli bir yer tutmaktadır.
More...
4c3f44e9-6d9e-4d15-90f9-30c526a7ce44|1|5.0
Daha önceki örneklerde Fluent NHibernate i her seferinde tek bir sınıf ile kullandık(Öğrenci sınıfı) bu örnekte ise birbiri ile ilişkisi olan iki farklı sınıf tasarlayıp nasıl Map edileceğine deyiniyor olacağım. Örneği yine öğrenci sınıfını kullanarak anlatacağım ve bu sefer Sınıf adında başka bir sınıfımız daha olacak. Böylelikle aralarındaki ilişkiyi kurarak ilişkisel nesneleri de anlamaya çalışıyor olacağız.
Genel olarak ifade etmem gerekirse her öğrencinin bir sınıfının ve her sınıfında öğrencileri olduğunu kabul ederek iki sınıfı da tasarladığımı söyleyebilirim. Böylelikle aşağıdaki öğrenci ve sınıf nesnelerini tanımlayabilirim.
More...
8c4d1a59-96a3-4838-9c34-133956c6997f|2|5.0
Merhabalar, bu yazıyı okumadan önce şu yazıyı okumanızı tavsiye eder ve söze böylelikle başlarım. :) Bilindiği üzere NHibernate kendine has HQL diye bir sorgulama diline sahiptir. Bu sorgulama dilini öğrenmek yerine ben linq le gayet iyiydim diyenler için NHibernate.Linq projesi geliştirilmiş. Kullanımına dair küçük bir örnek:
session.Linq<Ogrenci>().ForEach(o => Console.WriteLine(o.AdiSoyadi));
More...
ed7220b1-c863-49e8-a595-29940e585286|1|5.0
Daha önceki yazımda bahsettiğim gibi korkutucu yazıların aksine basit örneklerle devam etmeyi uygun görüyorum. Bu yazıda NHibernate ile basit bir veri yapısını nasıl modeller ve kullanırız sorusuna yanıt arıyoruz diyelim.
NHibernate de geleneksel olarak veri yapıları xml dosyaları ile yapılıyor ancak sınıf temelli yazmamanın daha uygun olduğunu düşünüyorum. Örneğin bir öğrenci veri yapısında öğrenci no, adı, soyadı gibi alanların xml içinde tanımlanmasında kuşkusuz bir sorun yok ancak ayrıca bir öğrenci sınıfının yazılmasına da ihtiyaç duyuyor. Öyleyse neden xml ihtiyaç var ki? sorusunu soranlardan olarak yaptığım araştırma sonucunda Fluent NHibernate'i keşfettim. Bu yazıda Fluent NHibernate ile ilgili örnekler üzerinden devam edelim.
Merhaba dünya projesi için izlenmesi gereken adımlar şöyle olmalı:
1) Fluent NHibernate'in son sürümü bakkaldan alınmalıdır. (İndir)
2) İndirilen NHibernate dll'leri bir güzel yıkanıp zipten çıkarılmalı ve projemize referans edilmelidir.
3) Konfigurasyon ile ilgili kodlar yazıldıktan sonra, öğrenci sınıfı ile ilgili kodlar yazılmalıdır.
NHibernate'i indirip referans ettikten sonra veritabanı ayarları için aşağıdaki xml dosyasını tanımlayalım.
<?xml version="1.0" ?>
<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2" >
<session-factory>
<property name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property>
<property name="dialect">NHibernate.Dialect.MsSql2008Dialect</property>
<property name="connection.driver_class">NHibernate.Driver.SqlClientDriver</property>
<property name="connection.connection_string">server=.;database=tb;integrated security=true;</property>
<property name="proxyfactory.factory_class">NHibernate.ByteCode.Castle.ProxyFactoryFactory, NHibernate.ByteCode.Castle</property>
</session-factory>
</hibernate-configuration>
Aşağıdaki kod ile ayarı okutalım:
var configuration = new Configuration();
configuration.Configure("DatabaseConfiguration.xml"); // Veritabanı ayarlarını oku
configuration.AddAssembly("NHibernate_HelloWorld"); // Hangi veri yapılarını okuyacağını anla
Öğrenci sınıfını aşağıdaki gibi tanımlayalım:
namespace NHibernate_HelloWorld
{
using System;
using FluentNHibernate.Mapping;
public class Ogrenci
{
public virtual int OgrenciId { get; set; }
public virtual string AdiSoyadi { get; set; }
public virtual DateTime DogumTarihi { get; set; }
}
public class OgrenciMap : ClassMap
{
public OgrenciMap()
{
Id(x => x.OgrenciId);
Map(x => x.AdiSoyadi);
Map(x => x.DogumTarihi);
}
}
}
Konsol uygulamasına ait kodlama'da aşağıdaki gibi olsun:
using System;
using NHibernate.Cfg;
using NHibernate;
using FluentNHibernate.Cfg;
using NHibernate.Tool.hbm2ddl;
namespace NHibernate_HelloWorld
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Program başldı");
using (var sessionFactory = GetSessionFactory())
{
Console.WriteLine("Session Factory oluşturuldu");
using (var session = sessionFactory.OpenSession())
{
Console.WriteLine("Session oluşturuldu");
Ogrenci ogrenci = new Ogrenci();
ogrenci.AdiSoyadi = "Ömer Faruk ZORLU";
ogrenci.DogumTarihi = new DateTime(1987, 7, 27);
session.Save(ogrenci);
Console.WriteLine("Öğrenci kaydı eklendi");
}
}
}
static ISessionFactory GetSessionFactory()
{
Configuration configuration = new Configuration();
configuration.Configure("DatabaseConfiguration.xml"); // Veritabanı ayarlarını oku
return Fluently.Configure(configuration)
.Mappings(m => m.FluentMappings.AddFromAssemblyOf())
.ExposeConfiguration(BuildSchema)
.BuildSessionFactory();
}
static void BuildSchema(Configuration config)
{
new SchemaExport(config).Create(false, true);
}
}
}
Aşağıdaki videoda biraz daha açıklama çalıştım. Kafanız karıştıysa ve biraz daha karışsın istiyorsanız izleyin :)
d6bf885d-206e-4e44-9c71-9a9340cc1341|4|5.0
Merhabalar, kısa bir aradan sonra tekrar yazmaya başlıyorum nihayet. Genel itibari ile bu konuda pek yazılı materyal bulunmamasının da yazmaya karar vermem de etkili olduğunu belirtmek istiyorum. Database erişimi konusunda uzun zamandır çalıştığımı yakın arkadaşlarım bilirler. Araştırmalarım boyunca NHibernate den uzak durmaya çalıştım. Adı biraz ürkütücüydü ve çok büyük projelerde kullanıldığından felan bahsedildiği olmuştu. Sanırım benim gibi düşündüğünden dolayı uzak duran onlarca kişi var :) Konu üzerinde araştırdıkca aslında o kadar da korkulacak bir şey olmadığını farkettim. Bu bağlamda edindiğim bazı bilgileri de paylaşmakta fayda olduğunu düşünüyorum.

NHibernate kütüphanesi özetle database ile ilgili kodlama yükünün büyük bir kısımını üstlenir ve tek işi de database'den aldığı data ile ilgili olduğundan bu konuda uzmanlaşmıştır. Veritabanı ile uygulama arasındaki iletişimi sağlamak oldukca basitdir ancak bazı özel durumlar için kodlamada değişiklikler gerekebiliyor. Tüm kodlamanız yalnızca mssql destekliyor olmasına karşın bir gün patronunuz size bunun mysql sürümünüde yapmanızı isterse ne yapacaksınız? Kodlamanız farklı database'ler ile çalışabilir durumda olabilir ancak database dönüştürülebilir şekilde tasarlanmamışsa ne olacak? Çok özel bir örnek olmuş olabilir, kabul ediyorum ancak bu tür durumlarda ortaya çıkabiliyor. Maliyetler ve müşteri talepleri doğrultusunda işinizi bitirmeniz gerekiyor. Diğer taraftan veritabanı iletişim dili veritabanlarına göre değişiklik gösterebiliyor. Özetle veri tabanı erişim işini bu konuda uzman bir kütüphaneye bırakmakta fayda görüyorum, tabiki bu kararı verirkende işi kime emanet ettiğinize de iyi karar vermeniz icap eder.
Bu yazıda herhangi bir kod bloğu görmemiş ve görmeyecek olmanızın asıl sebebi nhibernate ile ilgili yazılarda xml veya class larla örnekler verilerek bir çok makalenin yakın zamana kadar beni ürkütmesinden dolayıdır. Temel olarak nhibernate sizin için veritabanı işlerini organize ediyorsa bir şekilde veri yapılarını bildirmeniz gerekiyor. Bir öğrenci takip sistemi düşünelim, öğrenci, öğretmen, sınıf vs. tablolarını veritabanında oluşturup yola koyuluyoruz(malesef) oysa önce nesnesel tasarımın yapılması çok daha uygundur. Bu bağlamda nhibernate'de veritabanı bağımsız(mssql, mysql, oracle gibi herhangi bir veritabanı ile) çalışabildiği için veri tabanı üzerinden tablo açarak başlamak çok anlamsız oluyor. Yapılması gereken ve genel olarak kullanılan iki yöntem var. Birincisi xml kodları ile veri yapınızı bildirmek ki tercih etmiyorum ikincisi de ilgili sınıfları yazıp(öğrenci, öğretmen vb. sınıfları) nhibernate'e sınıfa göre tabloları vb. oluşturmasını istediğinizi bildirmek ki bunu da çok seviyorum.
Özetlersek, nhibernate güçlü bir veri tabanı erişim ve etkileşim aracıdır ve bir şekilde veri yapılarını bildirdiğimiz taktirde veri getir götür işlerini üstleniyor.
Bu yazıyla nhibernate'in güzel yönlerinden kısaca bahsetmiş oldum. İlerleyen yazılarda teknik meselelere iniyor olacağız. Entitiy Framwork Code First ve SubSonic projelerine de arasıra gidip gelebiliriz diye umuyorum. Görüşmek üzere.
f3891680-7edd-4af1-8adb-0c5dd1b33c08|3|3.7
Sumer Filemanager is fully open source file management project code named Sumer Filemanager has released with version 0.1. This version we used json, templates, shift click and edit in place plugins of jQuery.And we used SharpZipLib for compress and extract files and folders. Thanks for all open source project authors.

Version 0.1 contains are bellow:
Rename: Rename file and folder names in place.
Compress: Zip and un-zip any files and folders quickly.
Multiple Upload: Upload and manage files and supports multiple file upload if browser too.
List: Listing files and folder with ajax async request for best performance.
Unfortunately we can't work on user friendly interface. Its be fine later but script supports easy design for new user interface because all use interfaces based on jquery templates.
You can download full source code runs on asp.net. Full source code published on codeplex. Click here to download it.
f0fcb872-3bf5-48ac-936f-c9c3d20183c2|4|4.8
Merhabalar, bu yazıda dynamic data ile kullanıcı arayüzünde rol tabanlı güvenlik konusunu inceleyeceğiz. Bunun için kendimize özel bir güvenlik yapısı oluşturacağız. Dynamic Data - Tablo ve kolon isimleri için globalizasyon işlemi başlıklı yazının okunmasında büyük fayda vardır. Bir çok yerde globalizasyon yapısında kullanılan yapının bilindiği kabul edilecektir. Yazı boyunca aşağıdaki iki tablo ile alakalı bilgiler yer alacaktır.

Dynamic data'yı yönetim paneli oluşturmak için kullandığımızı düşünelim. Tabiki aynı anda bir çok kullanıcı farklı güvenlik seviyeleriyle yönetim panelini kullanabilmelidir. Örneğin Admin seviyesindeki kullanıcı her şeyi yapabilirken editor seviyesinde bazı işllemler kısıtlanmalıdır. Bu kapsamda yapacağımız işi özetleyecek olursak; yetkilendirme işlemleri için bir xml dosyası hazırlayacağız ve MetaColumn sınıfından türettiğimiz yeni bir sınıf yardımıyla tablo ve kolonlar üzerindeki yetkileri kısıtlayacağız.Haydi kodlayalım.
Globalizasyon yazısındakine benzer şekilde xml dosyamız aşağıdaki gibi olsun:
<?xml version="1.0" encoding="utf-8" ?>
<permissions>
<cruds>
<crud name="Personel" operations="c,u,d" denyRoles="users" />
</cruds>
<dbobjects>
<dbobject name="Personel.Soyadi" denyRoles="users,editors" />
</dbobjects>
</permissions>
cruds segmentinde ekleme(c), okuma(r), güncelleme(u) ve silme(d) işlemlerini kısıtlayacağımız tablolar yer alırken dbobjects segmentinde tablo kolonlarının kullanılabilirliğini kısıtlıyor olacağız. Örneğin bu xml dosyasına göre users ve editors grubları Personel tablosundaki Soyadi alanını hiç bir yerde göremeyecekler.
Şimdi xml dosyasını okuyup gerekli kısıtlamayı yapacak sınıfa gelelim.
PermissionsHelper.cs sınıfı kaynak kodları:
namespace DynLibrary.Helpers
{
using System.Collections;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.IO;
using System.Web.Hosting;
using System.Web.Security;
public static class PermissionHelper
{
///
/// Tüm kısıtlama tanımlamalarını saklayacak koleksiyon
///
private static Hashtable _permisssionList;
static PermissionHelper()
{
_permisssionList = new Hashtable();
// Kısıtlama tanımlamalarını yükle
LoadPermission();
}
///
/// Kısıtlama tanımlarını yükleyecek metot
///
private static void LoadPermission()
{
string configFolder = ConfigurationManager.AppSettings["DynamicDataConfigFolder"];
string fullDbObjectsPath = Path.Combine(HostingEnvironment.MapPath(configFolder), "Permissions.xml");
string gKey = string.Empty;
DataSet ds = new DataSet();
// Xml dosyası okunuyor
ds.ReadXml(fullDbObjectsPath);
#region dbobject
if (ds.Tables["dbobject"].Rows.Count > 0)
{
List denyDboRolesList;
foreach (DataRow row in ds.Tables["dbobject"].Rows)
{
denyDboRolesList = new List();
// Tüm kısıtlamalar _permisssionList koleksiyonunda tutulacağından
// bu koleksiyona tanımlanacak anahtarların eşsiz olması gerekiyor.
// Koleksiyona atanacak anahtar tanımlanıyor.
gKey = string.Format("dbobjects.{0}.roles.deny", row["name"]);
// denyRoles özniteliğindeki roller virgülle ayırıldığından
// Split yardımıyla her biri tek tek denyDboRolesList
// koleksiyonuna aktarılıyor.
denyDboRolesList.AddRange(row["denyRoles"].ToString().Split(','));
// Eğer koleksiyonda böyle bir anahtar varsa üzerine yaz yoksa ekle
if (!_permisssionList.Contains(gKey))
_permisssionList.Add(gKey, denyDboRolesList);
else
_permisssionList[gKey] = denyDboRolesList;
}
}
#endregion
#region crud
if (ds.Tables["crud"].Rows.Count > 0)
{
List denyCrudRolesList;
foreach (DataRow row in ds.Tables["crud"].Rows)
{
denyCrudRolesList = new List();
// denyRoles özniteliğindeki roller virgülle ayırıldığından
// Split yardımıyla her biri tek tek denyDboRolesList
// koleksiyonuna aktarılıyor.
denyCrudRolesList.AddRange(row["denyRoles"].ToString().Split(','));
foreach (string operation in row["operations"].ToString().Split(','))
{
// Tüm kısıtlamalar _permisssionList koleksiyonunda tutulacağından
// bu koleksiyona tanımlanacak anahtarların eşsiz olması gerekiyor.
// Koleksiyona atanacak anahtar tanımlanıyor.
gKey = string.Format("cruds.{0}.{1}.roles.deny", row["name"], operation);
// Eğer koleksiyonda böyle bir anahtar varsa üzerine yaz yoksa ekle
if (!_permisssionList.Contains(gKey))
_permisssionList.Add(gKey, denyCrudRolesList);
else
_permisssionList[gKey] = denyCrudRolesList;
}
}
}
#endregion
}
///
/// O anki kullanıcının dboObjectName değişkeninde bildirilen
/// nesneye erişme durumunu dönderir
///
/// Erişmek istenilen nesne
///
public static bool CanAccessDboObject(string dboObjectName)
{
// Henüz rol tabanlı güvenlikle alakalı kod yazılmadığından
// roleNames değişkenini el ile atıyorum. Roles.GetRolesForUser()
// metotu ile daha sonra gerçek ortamda kullanılabilir.
string[] roleNames = { "users" }; // TODO: Roles.GetRolesForUser();
// Eşsiz anahtar oluşturuluyor
string roleDenyKey = string.Format("dbobjects.{0}.roles.deny", dboObjectName);
// Eğer herhangi bir kısıtlama varsa false değerini dönder
// metotun en altında eğer hiç bir engele takılmamışsa
// true değeri dönsün.
//
// Bu nesneye ait herhangi bir engelleme var mı?
if (_permisssionList.Contains(roleDenyKey))
{
// Engellemeye ait rol tanımlamalarını getir.
List denyList = (List)_permisssionList[roleDenyKey];
// Kullanıcının rolü engellemede tanımlıysa false değeri dönder
foreach (var roleName in roleNames)
{
if (denyList.Contains(roleName))
return false;
}
}
return true;
}
///
/// O anki kullanıcının tableName değişkeninde bildirilen
/// nesne üzerinde bildirilen crud yetkisine sahip olma durumunu dönderir
///
/// crud yetkisi öğrenilecek tablo adı
///
/// c:Create
/// r=Read
/// u=Update
/// d=Delete
///
///
public static bool CanAccessCrudOperation(string tableName, char crudOperation)
{
// Henüz rol tabanlı güvenlikle alakalı kod yazılmadığından
// roleNames değişkenini el ile atıyorum. Roles.GetRolesForUser()
// metotu ile daha sonra gerçek ortamda kullanılabilir.
string[] roleNames = { "users" }; // TODO: Roles.GetRolesForUser();
// Eşsiz anahtar oluşturuluyor
string roleDenyKey = string.Format("cruds.{0}.{1}.roles.deny", tableName, crudOperation);
// Eğer herhangi bir kısıtlama varsa false değerini dönder
// metotun en altında eğer hiç bir engele takılmamışsa
// true değeri dönsün.
//
// Bu tablo üzerinde ilgili crud i��lemi için herhangi bir engelleme var mı?
if (_permisssionList.Contains(roleDenyKey))
{
// Engellemeye ait rol tanımlamalarını getir.
List denyList = (List)_permisssionList[roleDenyKey];
// Kullanıcının rolü engellemede tanımlıysa false değeri dönder
foreach (var roleName in roleNames)
{
if (denyList.Contains(roleName))
return false;
}
}
return true;
}
}
}
PermissionHelpers sınıfından sonra MetaModel, MetaTable ve MetaColumn sınıflarının işini yapacak sınıf tanımlamalarını yapalım.
DynMetaModel.cs dosyası kaynak kodları:
namespace DynLibrary.Entities
{
using System.Web.DynamicData;
using System.Web.DynamicData.ModelProviders;
///
/// MetaModel nesnesinden türetilen DynMetaModel nesnesi
///
public class DynMetaModel : MetaModel
{
public DynMetaModel()
: base()
{
}
///
/// Tablo nesnesini oluşturan metottur. Bu metotta MetaTable yerine kendi
/// nesnemiz olan ve MetaTable nesnesinden türemiş olan DynMetaTable
/// nesnesini üretiyoruz.
///
///
///
protected override MetaTable CreateTable(TableProvider provider)
{
return new DynMetaTable(this, provider);
}
}
}
DynMetaTable.cs dosyası kaynak kodları:
namespace DynLibrary.Entities
{
using System.Web.DynamicData;
using System.Web.DynamicData.ModelProviders;
using DynLibrary.Helpers;
///
/// MetaTable nesnesinden türetilen DynMetaTable nesnesi
///
public class DynMetaTable : MetaTable
{
public DynMetaTable(MetaModel metaModel, TableProvider tableProvider)
: base(metaModel, tableProvider)
{}
protected override void Initialize()
{ base.Initialize(); }
///
/// Kolon nesnesini oluşturan metottur. Bu metotta MetaColumn yerine kendi
/// nesnemiz olan ve MetaColumn nesnesinden türemiş olan DynMetaColumn
/// nesnesini üretiyoruz.
///
///
///
protected override MetaColumn CreateColumn(ColumnProvider columnProvider)
{
return new DynMetaColumn(this, columnProvider);
}
}
}
DynMetaColumn.cs dosyası kaynak kodları:
namespace DynLibrary.Entities
{
using System.Web.DynamicData;
using System.Web.DynamicData.ModelProviders;
using DynLibrary.Helpers;
using System.Web.Security;
public class DynMetaColumn : MetaColumn
{
public DynMetaColumn(MetaTable metaTable, ColumnProvider columnProvider)
: base(metaTable, columnProvider)
{ }
public override bool Scaffold
{
get
{
//if (base.Scaffold)
// return true;
return PermissionHelper.CanAccessDboObject(this.Table.EntityType.Name + "." + this.Name);
}
}
}
}
DynMetaColumn sınıfında ezilen Scaffold özelliğini tabloya yazılan ek sınıflar(partial) ile her bir alan için tek tek tanımlamamız gerekiyordu. Burada ise her kolon oluşturulurken bu özellik çağırılacağından, tüm çağırma işlemlerini denetleme şansımız oluyor. Şimdi sıra son kod değişikliğinde, Global.asax dosyasında oluşturduğumuz MetaModel'i kullan dediğimizde işlem tamamlanmış olacaktır. Sayfa şablonlarından da ilgili değişiklikleri kontrol etmemiz gerekiyor. Bunun gerekli kodları tek tek yayınlamak yerine tüm projeyi(globalizasyon desteği de dahil olmak üzere) konunun en altındaki linkten indirebilirsiniz.
// Eski hali: MetaModel model = new MetaModel();
DynMetaModel model = new DynMetaModel();
Yetki kontrolü öncesi Personel tablosu görünümü:

Yetki kontrolü sonrası Personel tablosu görünümü:

Örnek projeyi indirmek için:
DD_Permissons_Globalization.rar (316,78 kb)
Faydalı olması dileğiyle, mutlu kodlar!
Ömer Faruk ZORLU
d9ab347d-1ebf-4572-a35d-90f9b9904a21|1|5.0