Mar
2
2014

ASP.Net MVC'de Tema Gerçekleştirme

Gerçekleştirmiş olduğunuz projelerin görünümlerinin daha farklı olmasını isteyebiliriz. Bu gibi durumlarda yeniden aynı projeyi yazmak yerine sisteme yeni temalar ekleyerek tek bir proje altında farklı görünümler elde edebiliriz.

Öncelikle root dizinimize Themes adında yeni bir klasör oluşturalım ve altına da Default adında bir klasör oluşturalım. Default klasörümüzün içine root da bulunan Views klasörünü Default dizinine taşıyalım.

Dizin yapımış şu şekilde olacaktır: 

 

Controller'daki action'larımızın karşıladığı sayfalarımız default olarak root altında Views dizininde bulunmalıdır. Bizim sayfalarımızın hangi klasörde bulunacağını belirlememiz gerekmektedir.

Öncelikle tema özelliklerini tutan bir sınıf yaratıyoruz:

public class Theme
{
    public string Name { get; set; }
    public string BasePath { get; set; }
    public string Path { get { return String.Format("~/{0}/{1}/",BasePath,Name); } }
    public Theme(string basePath, string name)
    {
        Name = name;
        BasePath = basePath;
    }
}

Şimdi de System.Web.Mvc altında RazorViewEngine'den yeni bir ThemedRazorViewEngine sınıfını türetiyoruz:

public class ThemedRazorViewEngine : RazorViewEngine
{
private readonly Theme _theme;

public ThemedRazorViewEngine(Theme theme)
{
_theme = theme;

base.ViewLocationFormats = new[]
{
_theme.Path + "/Views/{1}/{0}.cshtml",
_theme.Path + "/Views/Shared/{0}.cshtml",
"~/Themes/Default/Views/{1}/{0}.cshtml"
};

base.PartialViewLocationFormats = new[]
{
_theme.Path + "/Views/{1}/{0}.cshtml",
_theme.Path + "/Views/Shared/{0}.cshtml",
"~/Themes/Default/Views/Shared/{0}.cshtml"
};

base.AreaViewLocationFormats = new[]
{
_theme.Path + "/Views/{2}/{1}/{0}.cshtml",
_theme.Path + "/Views/Shared/{0}.cshtml",
"~/Themes/Default/Views/{1}/{0}.cshtml"
};
base.AreaPartialViewLocationFormats = new[]
{
_theme.Path + "/Views/{2}/{1}/{0}.cshtml",
_theme.Path + "/Views/{1}/{0}.cshtml",
_theme.Path + "/Views/Shared/{0}.cshtml",
"~/Themes/Default/Views/Shared/{0}.cshtml"
};
}

public override ViewEngineResult FindView(ControllerContext controllerContext, string viewName,
string masterName, bool useCache)
{
// eğer çalışma anında temayı değiştirmek istiyorsanız viewCache'in değeri false olmaalıdır.
const bool useViewCache = false;

return base.FindView(controllerContext, viewName, masterName, useViewCache);
}
}

Web.Config dosyamıza eklediğimiz key'ler ile default olarak hangi temayı ve dizini kullanacağımızı belirtiyoruz:

<appSettings>
<add key="ThemeName" value="Default" />
<add key="ThemeBasePath" value="Themes" />
</appSettings>

 Son aşamada ise global.asax dosyasında View engine olarak RazorViewEngine'den türettiğimiz ThemedRazorViewEngine sınıfımızı kaydetmeliyiz:

protected void Application_Start()
{
//..
RegisterViewEngine(ViewEngines.Engines);
}

public static void RegisterViewEngine(ViewEngineCollection viewEngines)
{
// mevcut engineleri temizliyoruz.
viewEngines.Clear();

var basePath = ConfigurationManager.AppSettings["ThemeBasePath"];
var themeName = ConfigurationManager.AppSettings["ThemeName"];

var theme = new Theme(basePath,themeName);

var themeableRazorViewEngine = new ThemedRazorViewEngine(theme);

viewEngines.Add(themeableRazorViewEngine);
}

Artık tema desteği olan bir ViewEngine'e sahip olduk. Artık dilediğimiz kadar tema ekleyebiliriz.

 

Kaynak: http://onuralptaner.com/arsivler/2013/07/18/mvc-razor-tema-destegi/

Jan
12
2014

Varolan bir veri tabanı ile Entity Framework Code First Uygulaması

Merhaba, öncelikle code first ne işe yarar bundan bahsedelim. Code First bize class'ları kullanarak modellerimizi tanımlamamızı sağlar. Peki avantajları nelerdir? Temel olarak üç avantajı vardır:

  • Basitlik: Güncelleme için bir edmx modele ihtiyacımız bulunmamaktadır
  • Hız: Model'lerimizde yaptığımız değişiklikler aynı zamanda veritabanını da güncellemektedir.
  • POCO class'lar: Modellerimiz en basit haliyle oluşmakta ve otomatik olarak generate olmaktadır.

Öncelikle var olan bir veritabanımız olduğunu düşünelim. Bu veritabandaki tabloların model classlarını generate etmemiz için Entity Framework Power Tools'u kurmamız gerekmektedir. Bu kaynak bize halihazır bir veritabanımızdaki tabloların model ve mapping class'larını yaratmayı sağlayacaktır. Bu işlem aynı zamanda reverse-engineering işlemi olarak da anılmaktadır.

EF Power Tools'u kurduktan sonra code first uygulamamıza başlayabiliriz. Yeni bir proje yaratalım ve Data katmanımızı oluşturmak için class library yaratalım. Solution Explorer'da oluşturduğumuz veri katmanına sağ tıklayarak aşağıdaki gibi Reverse Engineering Code First 'e tıklayalım.

Bu işlemden sonra data layer projemizde Models klasörü oluşacaktır. Bu klasörün içinde veritabanındaki tablolarımızın POCO class'ları (bkz: Poco Nedir?) yaratılmış olacaktır. Bunlar bizim modellerimizi oluşturan domain class'larımızdır.

Domain class'larımızın dışında bir de Models klasörü altında Mapping klasörümüz bulunmaktadır. Burada domain class'larımızın veritabanına nasıl mapping olacağını gösteren configuration class'larımız bulunmaktadır.

  • Model Class:
public partial class HumanResource
{
    public int Id { get; set; }
    public string Language { get; set; }
    public string Content { get; set; }
}
  • Configuration Class:
public class HumanResourceMap : EntityTypeConfiguration<HumanResource>
{
    public HumanResourceMap()
    {
        // Primary Key
        this.HasKey(t => t.Id);

        // Properties
        this.Property(t => t.Language)
            .IsRequired();

        // Table & Column Mappings
        this.ToTable("HumanResource");
        this.Property(t => t.Id).HasColumnName("Id");
        this.Property(t => t.Language).HasColumnName("Language");
        this.Property(t => t.Content).HasColumnName("Content");
    }
 }
  • CRUD işlemleri:

Artık veritabanına ulaşabiliriz. Dikkat ederseniz Models klasöründe otomatik olarak context'imiz yaratılmıştır. Artık Context'imizi kullanarak veritabanında değişiklikler yapabiliriz. Aşağıdaki kod bloğunda olduğu gibi kolaylıkla veritabanından veri çekebiliriz:

using (var db = new HumanResourceContext())
        {
            // Create and save a new HumanResource
            
            var content = "İlgili içerik";
            var lang = "TR";
 
            var hr = new HumanResource { Content = content, Language = lang };
            db.Blogs.Add(blog);
            db.SaveChanges();
 
            // Display all HumanResources from the database
            var query = from b in db.HumanResource
                        select b;
        }


Dec
29
2013

T-SQL ile tekrar eden satırların silinmesi

DELETE TableName 
FROM TableName
LEFT OUTER JOIN (
   SELECT MIN(Id) as Id, TargetColumn
   FROM TableName
   GROUP BY TargetColumn
) as KeepRows ON
   TableName.Id = KeepRows.Id
WHERE
   KeepRows.SettingRowId IS NULL