مرجع تخصصی برنامه نویسان

انجمن تخصصی برنامه نویسان فارسی زبان

کاربر سایت

ali-farzin

عضویت از 1393/05/11

Routing در Area و مشکل عدم شناسایی Routeها روی ActionLinkها

  • سه شنبه 2 تیر 1394
  • 22:52
تشکر میکنم

با سلام

(1)  در پروژه‌ای Routing پیاده شده و به خوبی کار میکند.

namespace Routing_Example.Controllers
{
    public class HomeController : Controller
    {
        [Route("Person/{name}")]
        public ActionResult ShowPerson(string name)
        {
            ViewBag.name = name;
            return View();
        }
    }
}

 

(2)  به این پروژه یک Area با نام AAA اضافه شده و که متد آن به شکل زیر است:

 

namespace Routing_Example.Areas.AAA.Controllers
{
    [RouteArea("AAA", AreaPrefix = "Ara")]
    [RoutePrefix("AAH")]
    public class AAAHomeController : Controller
    {
        [Route("AAAHello")]
        public ActionResult Hello()
        {
            ViewBag.Hello = "سلام عرض میشود";
            return View();
        }
    }
}

 

(3) روت کانفیگ در ریشه پروژه و همچنین در Area به شکل زیر است:

namespace Routing_Example
{
    public class RouteConfig
    {
        public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

            routes.MapMvcAttributeRoutes();

            routes.MapRoute(
                name: "Default",
                url: "{controller}/{action}/{id}",
                defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },
                namespaces: new[] {"Routing_Example.Controllers"}
            );
        }
    }
}

 

namespace Routing_Example.Areas.AAA
{
    public class AAAAreaRegistration : AreaRegistration 
    {
        public override string AreaName 
        {
            get 
            {
                return "AAA";
            }
        }

        public override void RegisterArea(AreaRegistrationContext context) 
        {
            context.MapRoute(
                "AAA_default",
                "AAA/{controller}/{action}/{id}",
                new { area = "AAA", controller = "Home", action = "Index", id = UrlParameter.Optional },
                new[] { "Routing_Example.Areas.AAA.Controllers" }
            );
        }
    }
}

 

بیان سئوال:
Routing رو در area هم پیاده شده است و اگر آدرس Route شده را در Addressbar زده شود، صفحه مورد نظر در Area به درستی باز میشود ولی ActionLinkها (با وجود آنکه نام area را به شکل زیر به آن افزوده‌ شده است) همچنان آدرس اولیه (Route نشده) را برمی‌گردونند.
برای استفاده از Routing در areaی AAA:
۱ - در بالای کنترلر برای area از ایریبیوت [RouteArea("AAA", AreaPrefix = "Ctrl") استفاده شد.
۲ - برای کنترولر هم از اتریبیوت RoutePerfix استفاده گردید
۳ - برای متدهای داخل کنترلر را همانند بالا، از اتریبیوت Route‌استفاده شد.
۴ - در کلیه لینک‌ها area و نام کنترولر را مانند زیر تعیین کردم.

@Html.ActionLink("Hello", "Hello", "AAAHome", new { area = "AAA", controller = "AAAHome" }, null)


 

پاسخ های این پرسش

تعداد پاسخ ها : 4 پاسخ
کاربر سایت

ایمان مدائنی

عضویت از 1392/01/20

  • چهارشنبه 3 تیر 1394
  • 08:02

شما وقتی از روت ها استفاده میکنید دیگه نمیتونید از ActionLink استفاده کنید

باید از تگ a استفاده کنید

کاربر سایت

ali-farzin

عضویت از 1393/05/11

  • پنجشنبه 4 تیر 1394
  • 10:01

مشکل استفاده از تگ a این است که پس از ساخت ویوها توسط t4ها باید کلیه لینک‌های مربوط به create, edit, detaile, delete, return to list را دستی اصلاح کرد و در پروژه‌ای که تعداد زیادی view و controller دارد، کار چندان مطلوبی نیست. بهتره قید Routing رو بزنم.

آیا می‌شود T4ها را به شکلی مجهز کرد که بتوانند Route Nameها و RouteArea Nameها و RoutePerfix Name را برگردونند و تک a مورد نظر رو با آدرس روتها ساخت؟
کاربر سایت

ali-farzin

عضویت از 1393/05/11

  • یکشنبه 4 مرداد 1394
  • 12:00

با سلام

مشکل را پیدا کردم.

کار کردن با تک a در پروژه‌های بزرگ دردسرهای زیادی ایجاد می‌کند و یک تغییر کوچک در نامگذاری Routeها تبعات روزآمدسازی کامل و درست تمامی urlهای را به دنبال می‌آورد.

مزیت تولید خودکار urlها توسط Url.Actionها و یا ActionLinkها به آن است که چون نام اکشن‌ها، کنترولرها و اریا‌ها کمتر دستخوش تغییر می‌شوند، اصلاح urlها دردسرساز نمی‌شود.

برای رفع مشکل عدم شناسایی Routeها روی ActionLinkها و تولید urlهای منطبق با Routing کافی است در فایل Global.asax خط رجیستر آل اریاز را به بعد از خط رجیستر روتز جابجا کرد. مانند زیر:

         protected void Application_Start()
        {
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            AreaRegistration.RegisterAllAreas();
            BundleConfig.RegisterBundles(BundleTable.Bundles);
        }

نکته - به این ترتیب استفاده از Routing در تمام کنترولرها چه داخل areaها و چه در root پروژه الزامی می‌شود و کنترل‌هایی که فاقد Routing باشند error 404 تولید می‌کنند.

کاربر سایت

ali-farzin

عضویت از 1393/05/11

  • دوشنبه 5 مرداد 1394
  • 08:46

نکته جدیدتر

اگر  خط  RegisterAllAreas را کلاً از فایل Global به فایل RouteConfig منتقل کنیم (بعد از خط MapMvcAttributeRoutes به شکل زیر)، آنگاه مشکل الزام‌آور شدن استفاده از Routing در کلیه کنترولرها هم برطرف می‌شود و اگر در یکی از کنترولرها از Route استفاده نکردیم با همان روتینگ دیفالتی که برای آن area تعیین شده کار خواهد کرد.

مانند زیر:

namespace Routing_Example
{
    public class RouteConfig
    {
        public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
 
            routes.MapMvcAttributeRoutes();
            AreaRegistration.RegisterAllAreas();

            routes.MapRoute(
                name: "Default",
                url: "{controller}/{action}/{id}",
                defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },
                namespaces: new[] {"Routing_Example.Controllers"}
            );
        }
    }
}

آدرس رفرنس :  http://blogs.msdn.com/b/webdev/archive/2013/10/17/attribute-routing-in-asp-net-mvc-5.aspx

کاربرانی که از این پست تشکر کرده اند

هیچ کاربری تا کنون از این پست تشکر نکرده است

اگر نیاز به یک مشاور در زمینه طراحی سایت ، برنامه نویسی و بازاریابی الکترونیکی دارید

با ما تماس بگیرید تا در این مسیر همراهتان باشیم :)