kazimyaver | ASP.NET MVC

There is already an object named 'tableName' in the database.

Merhaba,

Code First yöntemi ile oluşturduğunuz databasede, zamanla modellerde değişiklik yapma ihtimaliniz var. Karışıklığa sebebiyet verip There is already an object named 'tableName' in the database. hatası ile karşılaşmanız durumunda telaşa kapılmadan yeniden Migration oluşturmanız ve Update-Database yapmanız sizi kurtaracaktır.

 "Package Manager Console" açarak şu komutları uyguluyoruz.

Add-Migration Initial -IgnoreChanges

Update-Database -verbose

Umarım yararlı olur. İyi günler.

ASP.NET MVC Çoklu Dil Desteği / Multi Language

Merhaba, ASP.NET MVC uygulamamızda çoklu dil desteği çalışmasını hızlı bir şekilde gerçekleştirelim;

Öncelikle yeni bir proje oluşturuyoruz oluşturduğumuz projenin menü alanını dile göre şekillendireceğiz. 

Solution Explorer'a sağ tıklayarak yeni bir klasör ekleyelim Resources isminde. Oluşturduğumuz klasöre sağ tıklayarak Add > New Item > General sekmesi altından Resource File ekliyoruz istediğiniz ismi verebilirsiniz ben Home ismini kullandım. 


Name kısmına değişken isimlerimizi belirliyoruz. Value kısmına da bu alanların değerlerini giriyoruz. Access Modifier : seçeneğinden Public seçili olması gerekiyor.

Daha sonra Home.resx dosyasına sağ tıklayarak copy - paste yapıyoruz. İsmini değiştirerek Home.tr.resx yapıyoruz. İçinde ki Value alanlarını Türkçe'ye çeviriyoruz.

Projemizde View > Shared klasörü altından _Layout.cshtml'i açarak. Menü alanında bulunan;

@Html.ActionLink("Home""Index""Home")

Şeklinde olan kısımdan linkText alanına Resources'dan gelen değerimizi yazacağız.

@Html.ActionLink(MultiLanguage.Resources.Home.Home, "Index""Home")

Şeklinde olacak. Tüm değişiklik gösterecek alanları da ayarladıktan sonra yeni bir Language adında Controller eklememiz gerekiyor. 

Yeni bir action ekliyoruz şu şekilde olacak;

public ActionResult Change(String languageSelect)
{
    if (languageSelect != null)
    {
         Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(languageSelect);
         Thread.CurrentThread.CurrentUICulture = new CultureInfo(languageSelect);
    }

    HttpCookie cookie = new HttpCookie("language");
    cookie.Value = languageSelect;
    Response.Cookies.Add(cookie);

    return View("Index");
}

Global.asax dosyasına girerek Application_BeginRequest'i düzenliyoruz. Eğer yoksa baştan oluşturabilirsiniz.

protected void Application_BeginRequest(object sender, EventArgs e)
{
    HttpCookie cookie = HttpContext.Current.Request.Cookies["Language"];
    if (cookie != null && cookie.Value != null)
    {
       System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo(cookie.Value);
       System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo(cookie.Value);
    }
    else
    {
       System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en");
       System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("en");
    }
}

Global.asax dosyasına girerek Application_BeginRequest'i düzenliyoruz. Eğer yoksa baştan oluşturabilirsiniz.

Derleyip çalıştırdığımız zaman dil seçimine göre sayfa içerisinde ki textlerin değiştiğini göreceksiniz. Umarım yararlı olur kaynak kodları aşağıda paylaşıyorum. Bir sonra ki yazıda görüşmek üzere.

Kaynak Kodları 

ASP.NET Session Clear on Browser Close

Merhaba, ASP.NET ile geliştirdiğiniz uygulamalarda Session'a aldığınız değerleri Browser kapatıldıktan sonra temizlemek için bu yöntemi kullanabilirsiniz. 

<script type="text/javascript">        
    $(document).ready(function () {        
        window.addEventListener('beforeunload',recordeCloseTime);     
    });     
    function recordeCloseTime() {        
        $.ajax({ 
            type: "POST",        
            url: "ServiceToClearSession.asmx/RecordCloseTime",     
        });         
    } 
</script>

Daha sonra projemize ServiceToClearSession.asmx dosyası ekliyoruz içerisine..

[WebMethod(EnableSession = true)]
public void RecordCloseTime(){  
    HttpContext.Current.Session.Clear();}

Umarım faydalı olmuştur. iyi çalışmalar.

ASP.NET MVC Area Hatası - Multiple types were found that match the controller named

Merhaba, 

Multiple types were found that match the controller named 'Home'. This can happen if the route that services this request ('{controller}/{action}/{id}') does not specify namespaces to search for a controller that matches the request. If this is the case, register this route by calling an overload of the 'MapRoute' method that takes a 'namespaces' parameter.

Yukarıda ki hatayı alıyorsak eğer büyük ihtimalle bir Area ekledik ve Controller'larımız çakışıyor. Bu hatanın çözümü oldukça basit. Ulaşmak istediğimiz sayfaların Controller'larını tanımlamamız gerekmekte. 
Solution Explorer penceresinden App_Start klasörüne girerek, RouteConfig.cs dosyamızı açıyoruz.
routes.MapRoute(
  name: "Default",
  url: "{controller}/{action}/{id}",
  defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },
  namespaces: new string[] { "ProjeAdi.Controllers" }
);

İlk açtığımızda yukarıda ki kalın punto ile seçili kodun olmadığını göreceğiz. Ekleme işlemini gerçekleştiriyoruz. Daha sonra aynı işlemi, Area > Admin > AdminAreaRegistration.cs dosyasına uyguluyoruz. 

namespaces: new string[] { "ProjeAdi.Areas.Admin.Controllers" }

Burada ki Admin'in yerinde sizin oluşturduğunuz Area'nın ismi olabilir. Projemizi derleyip kontrol edebilirsiniz.

İyi çalışmalar.

SQL Schema Hatası ve Değiştirme

Merhabalar,

Oldukça basit fakat bir o kadar can sıkıcı bir hata. Veritabanı taşıma işleminden sonra amansızca tabloları göremeyip hazırladığımız projenin sağdan soldan patladığını gördüğümüzde aklımıza gelebilecek bir çözüm yönetimi.

Öncelikle bu hata ile karşı kaşıya olup olmadığınızı kontrol edin. Taşıma işlemini gerçekleştirmeden önce ki veritabanınızın içinde ki tablo isimlerinin başında dbo.TabloAdi şeklinde bir ibare bulunuyor, taşıdıktan sonra ki tablo isimlerinin başında user.TabloAdi ne alaka dedirtecek bir isim bulunuyor ise bu sisteminizin patlamasına sebep olur. Zaten schema isiminde değişiklik yoksa hatayı farklı yerlerde arayın. Çözüme gelecek olursak;

SQL Management Studio'yu açarak değiştirmek istediğimiz veritabanında bir kaç sorgu çalıştıracağız.

İlgili menüden New Query 

ALTER SCHEMA dbo TRANSFER user.TabloAdi

Sorgusunu execute ettiğimiz zaman değişikliğin gerçekleştiğini göreceğiz. Umarım yararlı olur. İyi çalışmalar.


ASP.NET MVC _Layout CSS Menü Active

Bir önce ki yazımda klasik ASP.NET'de bu işlemin nasıl gerçekleştirildiğini sizlere anlatmıştım. Sanırım ihtiyaç doğrultusunda bunlar araştırılıyor fakat tam olarak kodlara hakim olunmadığı zaman bu tarz arayışlara giriliyor. Bu konu ile ilgili Türkçe kaynak mevcut değil. 

ASP.NET MVC ile eğer bir proje geliştiriyor ve _Layout (ASP.NET'de ki Master.Page) yapısını kullanıyorsanız ihtiyaç duyacağınızı düşünüyorum. Hazırlamış olduğunuz web sitelerinin menülerinde ki farklılığı kullanıcılara rahatlıkla yansıtabilirsiniz. Bu işlem oldukça basit gerçekleşiyor. Kullanıcı menüye tıklıyor ve o anda seçili olan menü elamanı diğerlerinden biraz daha farklı görünmesini sağlıyor. Bu da kullanıcının şuan o sayfada olduğunu göstermek için. Bkz:

Şimdi gelelim bu işlemi en basit nasıl gerçekleştiririz. MVC'nin bize sunmuş olduğu kolaylıklarla bu işlemi oldukça basit bir şekilde gerçekleştireceğiz. MVC Helpers işimizi oldukça kolaylaştıracak. Bu konuyu detaylıca bu adresten inceleyebilirsiniz. 

Öncelikle Solution Explorer penceresinden Projemize sağ tıklayarak yeni bir klasör oluşturuyoruz. Ben ismini Helpers yaptım.

Daha sonra oluşturduğumuz klasör üzerine sağ tıklayarak Add > New Item > Class ekliyoruz. İsmini'de HtmlHelpers.cs yapıyoruz.

Kodları aynen bu şekilde yazıyoruz. 
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
namespace MVCProject.Helpers
{
    public static class HtmlHelpers
    {
        public static string ActivePage(this HtmlHelper helper, string controller, string action)
        {
            string classValue = "";
            string currentController = helper.ViewContext.Controller.ValueProvider.GetValue("controller").RawValue.ToString();
            string currentAction = helper.ViewContext.Controller.ValueProvider.GetValue("action").RawValue.ToString();
            if (currentController == controller && currentAction == action)
            {
                classValue = "active";
            }
            return classValue;
        }
    }
}
Daha sonra _Layout sayfamıza gelerek. Sayfamızın en başına oluşturduğumuz Helpers'ı ekliyoruz. 
@using MVCProject.Helpers; //MVCProject benim projemin ismi.
_Layout sayfasında ki menü kodlarına gelerek gerekli eklemeleri tamamlıyoruz.
<ul class="topnav">
   <li><a href="/Home/Index" class="@Html.ActivePage("Home","Index")">Anasayfa</a></li>
   <li><a href="/Home/About" class="@Html.ActivePage("Home","About")">Hakkımızda</a></li>
   <li><a href="/Home/Contact" class="@Html.ActivePage("Home","Contact")">İletişim</a></li>
</ul>

Menü kodumuzun içinde ki class="active" kodunu kullanmaktansa her menü elemanının class'ına @Html.ActivePage("Home","Index") kod parçacığını yazıyoruz. Böylece kullanıcı hangi sayfada geziniyor iste o sayfanın class'ını active olarak ekliyor. Diğer class'lar boş kalacaktır. 

@Html.ActivePage("Controller Adı","Action Adı") Burada ki ActivePage ise Helpers içinde oluşturmuş olduğumuz sınıf.

Umarım faydalı olmuştur.