it-swarm.com.de

MVC4 Standardroute bei Verwendung von Bereichen

Ich versuche, Bereiche innerhalb der MVC-App zu verwenden. Ich möchte, dass die Standardroute zum HomeController innerhalb des Administrationsbereichs aufgelöst wird, aber zum Home-Controller auf der Stammwebsite. Ich habe den Namespace des Admin-HomeControllers hinzugefügt, aber er wurde weiterhin in den Stamm-HomeController aufgelöst.

Meine Routenkonfiguration:

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"}

        );
    }
}

admin-Bereich Route

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 - Adminbereich

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

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

   }
}

Irgendeine Idee, warum es sich nicht richtig auflösen lässt? Vielen Dank

9
spooti

Ich habe Ihren Code für die Gebietsregistrierung getestet und er funktioniert und wählt den richtigen Controller aus. Die Ansichtsauflösung findet die Ansicht jedoch im Stammordner, auch wenn der richtige Controller verwendet wird.

Zum Testen habe ich die folgende Home-Index-Aktion in meinem Bereichshome-Controller verwendet:

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

Dann mein index.chstml in/Views/Home:

Root View: @Model

und meine index.cshtml in/Areas/Admin/Views/Home:

Admin Area view: @Model

Beim Ausführen lautet die Ausgabe:

Root-Ansicht: Admin-Bereich Home-Controller

Die Route bewirkt also, dass der Home-Controller im Administratorbereich ausgeführt wird. Anschließend wird die Ansichtsauflösung fortgesetzt und die Stammansicht anstelle der Administratoransicht gefunden.

Letztendlich ist die Ansichtsauswahl also falsch. Ihr Problem ist also dasselbe wie in Festlegen einer Standardroute (zu einem Bereich) in MVC .

9
Anders Abel

Am einfachsten ist es, ein Datentoken zu Ihrer Standardroute hinzuzufügen:

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

Einfach hinzufügen

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

bis zum Ende Ihrer Standardroutendefinition.

36
NovaJoe

Diese Lösung wird Ihre API-Route unterbrechen. Sie müssen einen eindeutigen Namen für jeden Bereich haben, wie es der Standardbereich vorsieht:

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

Die richtige Lösung für die Standardroute finden Sie unten:

Route des Webbereichs:

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

Hauptroute, über die Benutzer in den Bereich "Allgemein" weitergeleitet werden:

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
Lev K.

Versuchen Sie es auf diese Weise .... es hilft bei der Unterscheidung. Auch wenn Sie nicht area = "Web" hinzufügen, ist es in Ordnung

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;

Gleicher Weg

context.MapRoute(
    "Admin_default",
    "Admin/{controller}/{action}/{id}",
    new { controller = "Home", action = "Index", area = "Admin", id = "" },
    new[] { "Nop.Admin.Controllers" }
);
2
Tina

Fügen Sie die Index-Aktionsmethode in Ihrem Standard-Root-Home-Controller hinzu. Verwenden Sie in der Indexaktionsmethode die Anweisung "return redirecttoaction" für die Standardbereichsumleitung

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

Die Standardroute sollte sein

 routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new {controller = "Home", 
action = "Index", id = UrlParameter.Optional}
                );
1
giri-webdev

Der einfachste Weg, um von Gebieten von der AreaRegistration Page aus zu routen:

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
Abhay Naik

die Standardroute ist standardmäßig so, dass die Route in MVC zuerst aufgerufen wird, da in MVC die zuerst angegebene Route so aufgerufen wird

In deiner

RouteConfig.cs

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