Asp.Net MVC: Wie aktiviere ich Bindestriche in meinen URLs?

75

Ich möchte, dass meine URLs durch Bindestriche getrennt werden. Also statt:

/MyController/MyAction

Ich würde gerne:

/My-Controller/My-Action

Ist das möglich?

Jim Geurts
quelle
2
@ John die Frage, die Sie verlinkt haben, ist ein mögliches Duplikat, nicht dies, siehe die Daten, diese Frage wird etwa 2 Jahre später gestellt
Abhishek Siddhu

Antworten:

155

Sie können das ActionName-Attribut folgendermaßen verwenden:

[ActionName("My-Action")]
public ActionResult MyAction() {
    return View();
}

Beachten Sie, dass Sie dann Ihre View-Datei "My-Action.cshtml" (oder eine entsprechende Erweiterung) aufrufen müssen. Sie müssen auch in allen Html.ActionLink-Methoden auf "my-action" verweisen.

Für Controller gibt es keine so einfache Lösung.

Bearbeiten: Update für MVC5

Aktivieren Sie die Routen global:

public static void RegisterRoutes(RouteCollection routes)
{
    routes.MapMvcAttributeRoutes();
    // routes.MapRoute...
}

Mit MVC5 wurde das Attribut-Routing jetzt in das Projekt aufgenommen. Sie können jetzt verwenden:

[Route("My-Action")]

Zu Aktionsmethoden.

Für Controller können Sie ein RoutePrefixAttribut anwenden, das auf alle Aktionsmethoden in diesem Controller angewendet wird:

[RoutePrefix("my-controller")]

Einer der Vorteile der Verwendung RoutePrefixist, dass URL-Parameter auch an alle Aktionsmethoden weitergegeben werden.

[RoutePrefix("clients/{clientId:int}")]
public class ClientsController : Controller .....

Snip ..

[Route("edit-client")]
public ActionResult Edit(int clientId) // will match /clients/123/edit-client
ChadT
quelle
1
Das ist die wahre Antwort. Ich bin mir nicht sicher, warum Phil diese Informationen nicht hinzugefügt hat
Eduardo Molteni
2
Netter Tipp. Nur zum Hinzufügen: Wenn Sie dies mit dem Standardaufruf View () tun, sucht MVC irgendwo im Ordner Views nach "My-Action.aspx" und nicht nach "MyAction.aspx", es sei denn, Sie geben den ursprünglichen Namen explizit an.
Nicholas Piasecki
@Eduardo Ich denke, das ActionName-Attribut wurde für Preview 5 hinzugefügt, das direkt nach Phils Post herauskam.
David Kolar
Wie geben Sie den Namen der Ansichtsdatei explizit an? Muss ich den Namen der Ansichtsdatei in My-Action.aspx ändern?
Alex
4
@LordofScripts - Stellen Sie sicher, dass Sie das Routing entsprechend konfiguriert haben mit: route.MapMvcAttributeRoutes ();
ChadT
16

Sie können einen benutzerdefinierten Routenhandler erstellen, wie in diesem Blog gezeigt:

http://blog.didsburydesign.com/2010/02/how-to-allow-hyphens-in-urls-using-asp-net-mvc-2/

public class HyphenatedRouteHandler : MvcRouteHandler{
        protected override IHttpHandler  GetHttpHandler(RequestContext requestContext)
        {
            requestContext.RouteData.Values["controller"] = requestContext.RouteData.Values["controller"].ToString().Replace("-", "_");
            requestContext.RouteData.Values["action"] = requestContext.RouteData.Values["action"].ToString().Replace("-", "_");
            return base.GetHttpHandler(requestContext);
        }
    }

... und die neue Route:

routes.Add(
            new Route("{controller}/{action}/{id}", 
                new RouteValueDictionary(
                    new { controller = "Default", action = "Index", id = "" }),
                    new HyphenatedRouteHandler())
        );

Eine sehr ähnliche Frage wurde hier gestellt: ASP.net MVC-Unterstützung für URLs mit Bindestrichen

Andrew
quelle
11

Ich habe für dieses Problem eine Open-Source- NuGet-Bibliothek entwickelt, die EveryMvc / Url implizit in every-mvc / url konvertiert.

URLs in Großbuchstaben sind problematisch, da bei Cookie-Pfaden zwischen Groß- und Kleinschreibung unterschieden wird. Der größte Teil des Internets unterscheidet zwischen Groß- und Kleinschreibung, während Microsoft-Technologien URLs als Groß- und Kleinschreibung behandeln. ( Mehr in meinem Blogbeitrag )

NuGet-Paket: https://www.nuget.org/packages/LowercaseDashedRoute/

Um es zu installieren, öffnen Sie einfach das NuGet-Fenster in Visual Studio, indem Sie mit der rechten Maustaste auf das Projekt klicken und NuGet Package Manager auswählen. Geben Sie auf der Registerkarte "Online" "Kleinbuchstaben gestrichelte Route" ein. Es sollte angezeigt werden.

Alternativ können Sie diesen Code in der Package Manager-Konsole ausführen :

Install-Package LowercaseDashedRoute

Danach sollten Sie App_Start / RouteConfig.cs öffnen und die vorhandene route.MapRoute (...) aufrufen und stattdessen Folgendes hinzufügen:

routes.Add(new LowercaseDashedRoute("{controller}/{action}/{id}",
  new RouteValueDictionary(
    new { controller = "Home", action = "Index", id = UrlParameter.Optional }),
    new DashedRouteHandler()
  )
);

Das ist es. Alle URLs sind klein geschrieben, gestrichelt und implizit konvertiert, ohne dass Sie mehr tun müssen.

Open Source-Projekt-URL: https://github.com/AtaS/lowercase-dashed-route

Ata S.
quelle
Nachdem ich ungefähr ein Dutzend der anderen Lösungen ausprobiert hatte, die ich online gefunden hatte, war dies die erste, die tatsächlich mit MVC5 für mich funktionierte. Danke
Barryman9000
Ich danke dir sehr.
David
8

Hier ist, was ich mit Bereichen in ASP.NET MVC 5 gemacht habe und es hat mir sehr gut gefallen. Ich musste meine Ansichten auch nicht umbenennen.

Gehen Sie in RouteConfig.cs folgendermaßen vor:

 public static void RegisterRoutes(RouteCollection routes)
    {
        // add these to enable attribute routing and lowercase urls, if desired
        routes.MapMvcAttributeRoutes();
        routes.LowercaseUrls = true;

        // routes.MapRoute...
    }

Fügen Sie dies in Ihrem Controller vor Ihrer Klassendefinition hinzu:

[RouteArea("SampleArea", AreaPrefix = "sample-area")]
[Route("{action}")]
public class SampleAreaController: Controller
{
    // ...

    [Route("my-action")]
    public ViewResult MyAction()
    {
        // do something useful
    }
}

Die URL, die beim Testen auf einem lokalen Computer im Browser angezeigt wird, lautet: localhost / sample-area / my-action . Sie müssen Ihre Ansichtsdateien oder ähnliches nicht umbenennen. Ich war sehr zufrieden mit dem Endergebnis.

Nachdem die Routing-Attribute aktiviert wurden, können Sie alle vorhandenen Bereichsregistrierungsdateien wie SampleAreaRegistration.cs löschen.

Dieser Artikel hat mir geholfen, zu diesem Schluss zu kommen. Ich hoffe es ist nützlich für dich.

Daniel Eagle
quelle
3

Asp.Net MVC 5 unterstützt das Attribut-Routing und ermöglicht eine explizitere Kontrolle über Routennamen. Die Beispielnutzung sieht folgendermaßen aus:

[RoutePrefix("dogs-and-cats")]
public class DogsAndCatsController : Controller
{
    [HttpGet("living-together")]
    public ViewResult LivingTogether() { ... }

    [HttpPost("mass-hysteria")]
    public ViewResult MassHysteria() { }
}

Um dieses Verhalten für Projekte zu erhalten, die Asp.Net MVC vor Version 5 verwenden, finden Sie ähnliche Funktionen für das AttributeRouting-Projekt (auch als Nuget verfügbar ). Tatsächlich hat Microsoft den Autor von AttributeRouting kontaktiert, um ihn bei der Implementierung von MVC 5 zu unterstützen.

Jim Geurts
quelle
1
Wow, niemand hat die Ghostbusters-Referenz erwähnt?
Erik Philips
1

Sie können eine benutzerdefinierte Route schreiben, die von der Route-Klasse GetRouteData abgeleitet ist, um Striche zu entfernen. Wenn Sie jedoch die APIs aufrufen, um eine URL zu generieren, müssen Sie daran denken, die Striche für den Aktionsnamen und den Controllernamen einzuschließen.

Das sollte nicht zu schwer sein.

Gehackt
quelle
Phil hat recht (wie immer). Es gibt ein großartiges Beispiel, für das ich keine Anerkennung finden kann, aber ich bin dankbar, dass ich es gefunden habe. Es ist von einem MVP, und Sie können es hier finden .
Daniel Cox
Hier ist mein NuGet-Paket für diese Implementierung: nuget.org/packages/LowercaseDashedRoute Vergessen Sie nicht, die README auf GitHub zu lesen (über den Projektinfo-Link auf der NuGet-Seite)
Ata S.
1

Sie können eine bestimmte Route definieren, z.

routes.MapRoute(
    "TandC", // Route controllerName
    "CommonPath/{controller}/Terms-and-Conditions", // URL with parameters
    new {
        controller = "Home",
        action = "Terms_and_Conditions"
    } // Parameter defaults
);

Diese Route muss jedoch VOR Ihrer Standardroute registriert werden .

Nexxas
quelle
In ähnlicher Weise können Sie mit AttributeRouting einen beliebigen Routennamen angeben, mit dem zusätzlichen Vorteil, dass Sie genau wissen, welcher Route Ihre Aktion zugeordnet ist.
Jim Geurts
0

Wenn Sie Zugriff auf das IIS URL Rewrite-Modul haben ( http://blogs.iis.net/ruslany/archive/2009/04/08/10-url-rewriting-tips-and-tricks.aspx ), können Sie es einfach umschreiben die URLs.

Anforderungen an / my-controller / my-action können in / mycontroller / myaction umgeschrieben werden, und es ist nicht erforderlich, benutzerdefinierte Handler oder andere Elemente zu schreiben. Besucher erhalten hübsche URLs und Sie erhalten diejenigen, die MVC verstehen kann.

Hier ist ein Beispiel für einen Controller und eine Aktion. Sie können dies jedoch ändern, um eine allgemeinere Lösung zu erhalten:

<rewrite>
  <rules>
    <rule name="Dashes, damnit">
      <match url="^my-controller(.*)" />
      <action type="Rewrite" url="MyController/Index{R:1}" />
    </rule>
  </rules>
</rewrite>

Der mögliche Nachteil dabei ist, dass Sie Ihr Projekt auf IIS Express oder IIS umstellen müssen, damit das Umschreiben während der Entwicklung funktioniert.

Cory Mawhorter
quelle
0

Ich bin noch ziemlich neu bei MVC, also nimm es mit einem Körnchen Salz. Es ist keine elegante Komplettlösung, hat aber in MVC4 den Trick für mich getan:

routes.MapRoute(
    name: "ControllerName",
    url: "Controller-Name/{action}/{id}",
    defaults: new { controller = "ControllerName", action = "Index", id = UrlParameter.Optional }
);
gregtheross
quelle