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?
asp.net-mvc
Jim Geurts
quelle
quelle
Antworten:
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
RoutePrefix
Attribut anwenden, das auf alle Aktionsmethoden in diesem Controller angewendet wird:[RoutePrefix("my-controller")]
Einer der Vorteile der Verwendung
RoutePrefix
ist, 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
quelle
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
quelle
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
quelle
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.
quelle
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.
quelle
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.
quelle
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 .
quelle
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.
quelle
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 } );
quelle