MVC4 аймақтарын пайдалану кезінде әдепкі жол

Мен MVC бағдарламасының аумақтарын қолдануға тырысамын, әдепкі жол маршрутизатордағы домен контроллеріне шешілетінін қалаймын, бірақ root торабындағы басты контроллерді шешеді. Мен әкімші HomeController аттар кеңістігін қосып қойдым, бірақ ол әлі де түбір HomeController-ке шешілді.

Менің маршрутымның конфигурациясы:

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

        routes.MapRoute(
            "Default",
            "{controller}/{action}/{id}",
            new {controller = "Home", action = "Index", id = UrlParameter.Optional },
            new[] {"MvcApplicationAreas.Areas.Admin.Controllers"}

        );
    }
}

әкімшілік аймақ бағыты

public class AdminAreaRegistration : AreaRegistration
{
    public override string AreaName
    {
        get
        {
            return "Admin";
        }
    }

    public override void RegisterArea(AreaRegistrationContext context)
    {
        context.MapRoute(
            "Admin_default",
            "Admin/{controller}/{action}/{id}",
            new { action = "Index", id = UrlParameter.Optional }
        );
    }
}

HomeController - әкімшілік аймақ

namespace MvcApplicationAreas.Areas.Admin.Controllers
{
   public class HomeController : Controller
   {

       public ActionResult Index()
       {
           return View();
       }

   }
}

Неліктен дұрыс шешілмейтіні туралы кез-келген ой. Рахмет

9
Сондай-ақ, әкімші HomeController-ды бөлісе аласыз ба?
қосылды автор neontapir, көзі
Мен сіздің сұрағыңызды бірінші рет оқығанымда дұрыс түсіндім, сондықтан дұрыс емес жауапты жойып, жаңа нұсқаны ұсындым.
қосылды автор Anders Abel, көзі
Бұл хабарламаны тексеріңіз stackoverflow.com/questions/2140208/…
қосылды автор Bhushan Firake, көзі
Мен бұл постты көрдім, бірақ ол Pro MVC4 кітабынан «Бұл өзгеріс сұрауларды шешу кезінде негізгі жобада контроллерлерге басымдық берілетіндігін білдіреді MVC2, әрине, егер сіз аймақтағы контроллерлерге артықшылық бергіңіз келсе, орнына оны жасай алады. атаулар кеңістігін оң жақ HomeController
қосылды автор spooti, көзі

8 жауаптар

Ең қарапайым тәсілі - әдепкі жолға деректер таңбалауышын қосу:

routes.MapRoute(
    "Default",
    "{controller}/{action}/{id}",
    new {controller = "Home", action = "Index", id = UrlParameter.Optional }
).DataTokens.Add("area", "Admin");

Жай қосыңыз

.DataTokens.Add("area", "[your area name]");

әдепкі жол анықтамасының соңына дейін.

37
қосылды
Егер сізде қайталанатын контроллерлер болса, аттар кеңістігі сипатын қосыңыз. атаулар кеңістігі: жаңа [] {«Solution.MyProject.Areas.Admin.Controllers»}
қосылды автор Ray Suelzer, көзі
бұл менің жұмысымда контроллерлердің қайталанбайтындығын болжады, мысалы, екі HomeController
қосылды автор wal, көзі
Плюс 1, ол thx жұмыс істеді.
қосылды автор Usman Y, көзі

Мен сіздің аймағыңызды тіркеу үшін кодты тексердім, ол жұмыс істейді және дұрыс контроллерді таңдайды. Дегенмен, көрініс ажыратылымы, дұрыс контроллерді қолданатын болса да, түбірлік қалтадағы көріністі табады.

Тестілеу үшін менің домендерді үйдегі контроллерге келесі негізгі индексті қолдандым:

public ActionResult Index()
{
    return View(model: "Admin area home controller");
}

Содан кейін my index.chstml in/Views/Home:

Root View: @Model

және менің/index.cshtml ішіндегі/Areas/Admin/Views/Home:

Admin Area view: @Model

Іске қосылған кезде шығыс:

Түбір көрінісі: әкімшілік аймақ үйінің контроллері

Осылайша, маршрут үй басқарушысын әкімші аймағында іске қосады, бірақ содан кейін экранның көрінісі ажыратылады және әкімші көрінісінің орнына түбір көрінісін табады.

Сондықтан, ақыр аяғында, бұл дұрыс емес көрініс таңдау, сондықтан мәселеңіз .

9
қосылды
Көріп отырмын, осыны ойлағаныңыз үшін рахмет
қосылды автор spooti, көзі

Бұл шешім Сіздің API жолыңызды бұзады. Әдепкі аумақ сияқты әр аймақ үшін бірегей атауыңыз болуы керек:

context.MapRoute(
         "Common_default",
         "**Common**/{controller}/{action}/{id}",
         new { action = "Index", id = UrlParameter.Optional }
);

Төменде әдепкі жолға дұрыс шешім:

Веб-бағыттың бағыты:

context.MapRoute(
         "Common_default",
         "Common/{culture}/{controller}/{action}/{id}",
         new {culture = CultureHelper.GetDefaultCulture(), controller = "Home", action = "Index", id = UrlParameter.Optional }
);

Пайдаланушыларды «Жалпы» аймағына бағыттайтын негізгі бағыт:

routes.MapRoute(
            name: "Default",
            url: "{culture}/{controller}/{action}/{id}",
            defaults: new { culture = CultureHelper.GetDefaultCulture(), controller = "Home", action = "Index", id = UrlParameter.Optional },
            namespaces: new[] { "SMS.Sender.Areas.Common.Controllers" }
        ).DataTokens.Add("area","Common");
6
қосылды

Бұлай істеп көріңіз .... бұл айырмашылықты жеңуге көмектеседі. Егер өрісті = «Веб» қоспасаңыз, оның жақсы

routes.MapRoute(
    "Default",//Route name
    "{controller}/{action}/{id}",//URL with parameters
    new { controller = "Home", action = "Index", area="Web", id = UrlParameter.Optional },
    new[] { "Nop.Web.Controllers" }
).DataTokens["UseNamespaceFallback"] = false;

Сонымен қатар

context.MapRoute(
    "Admin_default",
    "Admin/{controller}/{action}/{id}",
    new { controller = "Home", action = "Index", area = "Admin", id = "" },
    new[] { "Nop.Admin.Controllers" }
);
2
қосылды
area = «Web» талап етілмегенін растады. RouteCollectionExtensions ішінен бұл MapRoute() жүктемесі, route.DataTokens [RouteDataTokenKeys.Namespaces] = namespaces; ішінен орындалады, сондықтан мені шеңберге сай келетін тәсіл ретінде көрсетеді. Мынадай бастапқы кодқа сілтеме: github.com/ASP-NET-MVC/aspnetwebstack/blob/master/src/…
қосылды автор Manfred, көзі

Әдепкі Root үй контроллерінде Индекс әрекеті әдісін қосыңыз. Индекстің әрекет ету әдісінде әдепкі аймақты қайта бағыттау үшін «қайтаруды қайта бағыттау» қолданбасы қолданылсын

    public ActionResult Index()
    {
        return RedirectToAction("Dashboard", "Home", new {area = "Home"});
    }

Әдепкі маршрут болуы керек

 routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new {controller = "Home", 
action = "Index", id = UrlParameter.Optional}
                );
1
қосылды

Сіздің

RouteConfig.cs

routes.MapRoute("redirect all other requests", "{*url}",
        new {
            controller = "UnderConstruction",
            action = "Index"
            }).DataTokens = new RouteValueDictionary(new { area = "Shop" });
0
қосылды

Аймақты тіркеу бетінен аудандардан өтудің ең оңай жолы:

context.MapRoute("MainDefault", "Main/{controller}/{action}/{id}", new { action = "Index", id = UrlParameter.Optional } , new[] { "Namespace.To.Controllers" });

context.MapRoute("ClearPath", "", new { controller = "Home", action = "Index" }, new[] { "Namespace.To.Controllers" });
0
қосылды

әдепкі жол, әдетте, MVC-де әдепкі жолмен қоңырау шалады, өйткені алдымен MVC-де қандай бағыт көрсетілсе, ол солай деп аталады

0
қосылды