Frage

Ich möchte Wörter in meinen URLs durch Bindestriche trennen.Also statt:

/MyController/MyAction

Ich würde gerne:

/My-Controller/My-Action

Ist das möglich?

War es hilfreich?

Lösung

Sie können das ActionName-Attribut wie folgt verwenden:

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

Beachten Sie, dass Sie Ihre Ansichtsdatei dann „My-Action.cshtml“ (oder eine entsprechende Erweiterung) nennen müssen.Sie müssen außerdem 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 nun in das Projekt integriert.Sie können jetzt Folgendes verwenden:

[Route("My-Action")]

Über Aktionsmethoden.

Für Controller können Sie a anwenden RoutePrefix Attribut, das auf alle Aktionsmethoden in diesem Controller angewendet wird:

[RoutePrefix("my-controller")]

Einer der Vorteile der Verwendung RoutePrefix Diese URL-Parameter werden auch an alle Aktionsmethoden weitergegeben.

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

Schnipsen..

[Route("edit-client")]
public ActionResult Edit(int clientId) // will match /clients/123/edit-client

Andere Tipps

Sie könnten 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 ganz ähnliche Frage wurde hier gestellt: ASP.net MVC-Unterstützung für URLs mit Bindestrichen

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

URLs in Großbuchstaben sind problematisch, da bei Cookie-Pfaden die Groß-/Kleinschreibung beachtet wird. Der größte Teil des Internets unterscheidet tatsächlich zwischen Groß- und Kleinschreibung, während Microsoft-Technologien URLs so behandeln, dass die Groß-/Kleinschreibung nicht beachtet wird.(Mehr dazu 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“ „Lowercase Dashed Route“ ein, und es sollte angezeigt werden.

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

Install-Package LowercaseDashedRoute

Danach sollten Sie App_Start/RouteConfig.cs öffnen, den vorhandenen route.MapRoute(...)-Aufruf auskommentieren 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 werden in Kleinbuchstaben geschrieben, gestrichelt und implizit konvertiert, ohne dass Sie etwas weiter tun müssen.

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

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

Gehen Sie in RouteConfig.cs wie folgt 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 in Ihrem Controller Folgendes 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 mit dem Endergebnis recht zufrieden.

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

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

Asp.Net MVC 5 unterstützt das Attributrouting und ermöglicht so eine explizitere Kontrolle über Routennamen.Die Beispielverwendung 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 eine ähnliche Funktionalität mit AttributeRouting-Projekt (Auch als Nuget erhältlich).Tatsächlich wandte sich Microsoft an den Autor von AttributeRouting, um ihn bei der Implementierung für MVC 5 zu unterstützen.

Sie könnten eine benutzerdefinierte Route schreiben, die von der Route-Klasse GetRouteData abgeleitet wird, um Bindestriche zu entfernen. Wenn Sie jedoch die APIs aufrufen, um eine URL zu generieren, müssen Sie daran denken, die Bindestriche für den Aktionsnamen und den Controllernamen einzufügen.

Das sollte nicht allzu schwer sein.

Sie können eine bestimmte Route definieren, z. B.:

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 angemeldet werden VOR Ihre Standardroute.

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 die URLs einfach umschreiben.

Anfragen an /my-controller/my-action können in /mycontroller/myaction umgeschrieben werden und es besteht dann keine Notwendigkeit, benutzerdefinierte Handler oder irgendetwas anderes zu schreiben.Besucher erhalten hübsche URLs und Sie erhalten solche, 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 die Verwendung von IIS Express oder IIS umstellen müssen, damit Umschreibungen während der Entwicklung funktionieren.

Ich bin noch ziemlich neu bei MVC, also nehmen Sie es mit Vorsicht.Es ist keine elegante Allheillösung, hat aber in MVC4 für mich den Zweck erfüllt:

routes.MapRoute(
    name: "ControllerName",
    url: "Controller-Name/{action}/{id}",
    defaults: new { controller = "ControllerName", action = "Index", id = UrlParameter.Optional }
);
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top