kazimyaver | Tüm yazılar etiketlendi 'ASP.NET MVC'

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.

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.