با سلام
(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)
شما وقتی از روت ها استفاده میکنید دیگه نمیتونید از ActionLink استفاده کنید
باید از تگ a استفاده کنید
مشکل استفاده از تگ a این است که پس از ساخت ویوها توسط t4ها باید کلیه لینکهای مربوط به create, edit, detaile, delete, return to list را دستی اصلاح کرد و در پروژهای که تعداد زیادی view و controller دارد، کار چندان مطلوبی نیست. بهتره قید Routing رو بزنم.
آیا میشود T4ها را به شکلی مجهز کرد که بتوانند Route Nameها و RouteArea Nameها و RoutePerfix Name را برگردونند و تک a مورد نظر رو با آدرس روتها ساخت؟
با سلام
مشکل را پیدا کردم.
کار کردن با تک 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 تولید میکنند.
نکته جدیدتر
اگر خط 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
هیچ کاربری تا کنون از این پست تشکر نکرده است
با ما تماس بگیرید تا در این مسیر همراهتان باشیم :)