Asp.Net routing die Umleitung auf homepage, wenn der url-parameter nicht definiert

Habe ich zwei Routen

routes.MapRoute(
    name: "Default",
    url: "{location}/{controller}/{action}/{id}",
    defaults: new { controller = "Products", action = "Index", id = UrlParameter.Optional }
    );

routes.MapRoute(
    name: "Home",
    url: "{controller}/{action}",
    defaults: new { controller = "Home", action = "Index" }
);

Wenn der Benutzer geht, um Haupt-Seite, er wählte zwei links:

<a href="/loc1/Products/index">Location 1</a>
<a href="/loc2/Products/index">Location 2</a>

Auch ich habe ActionFilterAttribute, wo ich das prüfen location parameter, und wenn die url nicht haben, ich umleiten von Benutzern an Haupt-home-Seite.

public override void OnActionExecuting(ActionExecutingContext filterContext)
{
    string location = (string)filterContext.RouteData.Values["location"];
    if (string.IsNullOrEmpty(location) 
        && filterContext.ActionDescriptor.ControllerDescriptor.ControllerName != "Home" 
        && !filterContext.IsChildAction)
    {
        filterContext.Result = new RedirectToRouteResult(
        new RouteValueDictionary 
        { 
            { "controller", "Home" }, 
            { "action", "Index" } 
        });
    }

    SessionUtils.SetLocationName(location);
}

Basiert auf der location variable I wird eine Abfrage verschiedene Datensätze aus der Datenbank, so dass, wenn Benutzer nicht jede Lage in der url und versucht, auf Products/index/5 ich will, dass Sie umgeleitet werden auf die Startseite, wo Sie haben zu wählen, Speicherort und klicken Sie auf einen der links.
Jedoch bekomme ich die Fehlermeldung:

Die Ressource kann nicht gefunden werden.

Beschreibung: HTTP 404. Die gesuchte Ressource oder eine Ihrer Abhängigkeiten) wurde möglicherweise entfernt, hatte Ihren Namen geändert, oder ist vorübergehend nicht verfügbar. Bitte Lesen Sie den folgenden URL, und stellen Sie sicher, dass Sie korrekt geschrieben ist.

Angeforderte URL: /Products/index

Wie muss ich richtig konfigurieren, Routen, so dass die Benutzer umgeleitet Haupt-Seite, wenn dort kein Standort-parameter in der url?



4 Replies
  1. 1

    Ihre „Default“ – route, die auch die Lage ist die einzige route, die jemals getroffen werden. Die controller, action und id Parameter sind alle optional, so dass eine Anfrage für so etwas wie /Products/Index wird tatsächlich abgefangen werden, durch die Sie Ihre „Default“ – route und die location param gegeben werden, „Produkte“ und Ihre controller param gegeben wird „Index“ als Wert. Die action param wird der Standardwert ist „Index“, und das id param werden nicht berücksichtigt. Da Sie offensichtlich nicht über ein IndexController mit einem Index Aktion, erhalten Sie einen 404.

    Unterscheiden sich die Routen, die Sie benötigen, um Ihre „Default“ – route erfordern irgendeine Art von hard-codiert-Präfix, D. H.

    routes.MapRoute(
        name: "Default",
        url: "location/{location}/{controller}/{action}/{id}",
        defaults: new { controller = "Products", action = "Index", id = UrlParameter.Optional }
        );

    Dann, die /Products/Index route fallen Sie durch, um Ihre „Home“ – route und interpretiert werden, richtig, wie eine route zu ProductsController.Index. Alternativ können Sie anwenden route-Constraints, um die location param, so dass es nicht mit alles, d.h.:

    routes.MapRoute(
        name: "Default",
        url: "{location}/{controller}/{action}/{id}",
        defaults: new { controller = "Products", action = "Index", id = UrlParameter.Optional },
        constraints: new { location = @"^(loc1|loc2)$" }
        );

    Dann, es sei denn, der erste Teil der URL entspricht entweder loc1 oder loc2 ist, wird es fallen, durch die „Home“ – route.

    • Mit einem Default route wenn ich auf die Hauptseite bekomme ich HTTP Error 403.14 - Forbidden. Ist es möglich, gehen Sie zur Hauptseite ohne ptoviding Ort-parameter?
  2. 0

    Haben Sie als hart codierte Standard-und fail-safe-Routen?

    routes.MapRoute("Home", "", new { controller = "Home", action = "Index" });
    /*     Normal routing logic here     */
    routes.MapRoute("FailSafe", "{*url}", new { controller = "Home", action = "Index"}); //!=Last Line=!
  3. 0

    versuchen Sie, eine benutzerdefinierteroute vor Default route

    routes.MapRoute(
       name: "Location1Route",
       url: "{location}/{controller}/{action}",
       defaults: new { controller = "Home", action = "Index" }
    );

    diese wird Ihren Bedürfnissen entsprechen.

    • Was ist, wenn ich will nicht abhängig sein loc1 und loc2'? The actual Ort` gezogen werden aus DB und HTML-Code automatisch renderred.
    • bearbeitet die Antwort auf Ihren Bedürfnissen entsprechen
  4. 0

    Kombiniert alle Antworten und vor allem Erklärungen, ich kam mit dieser Konfiguration

    Route-Konfiguration:

    routes.MapRoute(
        name: "DefaultShort",
        url: "{location}/",
        defaults: new { controller = "Products", action = "Index" }
    );
    
    routes.MapRoute(
        name: "Default",
        url: "{location}/{controller}/{action}/{id}",
        defaults: new { id = UrlParameter.Optional }
    );
    
    routes.MapRoute(
        name: "DefaultHome",
        url: "{controller}/{action}/",
        defaults: new { controller = "Home", action = "LandingPage"}
    );

    Einige Logik in OnActionExecuting

    if (string.IsNullOrEmpty(location) 
        && cookie != null
        && !string.IsNullOrEmpty(cookie.Values["location"])
        && filterContext.ActionDescriptor.ActionName == "LandingPage"
        && filterContext.ActionDescriptor.ControllerDescriptor.ControllerName == "Home")
    {
        filterContext.Result = new RedirectToRouteResult(
            new RouteValueDictionary
            {
                { "location", cookie.Values["location"]},
                { "controller", "Measurements" },
                { "action", "Index" }
            }
        );
    }
    else if (string.IsNullOrEmpty(location) 
        && filterContext.ActionDescriptor.ControllerDescriptor.ControllerName != "Home" 
        && !filterContext.IsChildAction)
    {
        filterContext.Result = new RedirectToRouteResult(
            new RouteValueDictionary
            {
                { "controller", "Home" },
                { "action", "LandingPage" }
            }
    }

    Wenn nur der Ort angegeben ist, dann wird es mit der ersten route, die Umleitung der Products controller.

    Die zweite route wird verwendet, wenn alle drei location, controller und action Parameter aufeinander abgestimmt sind, in die route. Ich habe nicht angegebenen Standard – controller und action. Dies ermöglicht, um die Letzte route, wenn das umleiten zu HomeController.

    Die Dritte route wird über zwei Parameter – controller und action, die es mir erlaubt zu bekommen, um eine Standard-Ansicht in HomeController. Mit OnActionExecuting ich bin das umleiten zu dieser Standard-view, und controller, wenn es nicht den Hinweis auf eine HomeController und LandingPage.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.