Domanda

Mi piacerebbe che i trattini separassero le parole nei miei URL.Quindi invece di:

/MyController/MyAction

Mi piacerebbe:

/My-Controller/My-Action

È possibile?

È stato utile?

Soluzione

Puoi utilizzare l'attributo ActionName in questo modo:

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

Tieni presente che dovrai quindi chiamare il file di visualizzazione "My-Action.cshtml" (o estensione appropriata).Dovrai anche fare riferimento a "my-action" in qualsiasi metodo Html.ActionLink.

Non esiste una soluzione così semplice per i controller.

Modificare:Aggiornamento per MVC5

Abilita i percorsi a livello globale:

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

Ora con MVC5, il routing degli attributi è stato assorbito nel progetto.Ora puoi utilizzare:

[Route("My-Action")]

Sui metodi di azione.

Per i controller, è possibile applicare a RoutePrefix attributo che verrà applicato a tutti i metodi di azione in quel controller:

[RoutePrefix("my-controller")]

Uno dei vantaggi dell'utilizzo RoutePrefix Anche i parametri URL verranno passati a qualsiasi metodo di azione.

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

Taglia..

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

Altri suggerimenti

Potresti creare un gestore di route personalizzato come mostrato in questo blog:

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);
        }
    }

...e il nuovo percorso:

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

Una domanda molto simile è stata posta qui: Supporto ASP.net MVC per URL con trattini

Ho sviluppato un open source Libreria NuGet per questo problema che converte implicitamente EveryMvc/Url in Every-mvc/url.

Gli URL maiuscoli sono problematici perché i percorsi dei cookie fanno distinzione tra maiuscole e minuscole, la maggior parte di Internet in realtà fa distinzione tra maiuscole e minuscole mentre le tecnologie Microsoft trattano gli URL senza distinzione tra maiuscole e minuscole.(Maggiori informazioni sul mio post sul blog)

Pacchetto NuGet: https://www.nuget.org/packages/LowercaseDashedRoute/

Per installarlo, è sufficiente aprire la finestra NuGet in Visual Studio facendo clic con il pulsante destro del mouse sul progetto e selezionando Gestione pacchetti NuGet, quindi nella scheda "Online" digitare "Percorso tratteggiato minuscolo" e dovrebbe apparire.

In alternativa, puoi eseguire questo codice nella Console di gestione pacchetti:

Install-Package LowercaseDashedRoute

Successivamente dovresti aprire App_Start/RouteConfig.cs e commentare la chiamata route.MapRoute(...) esistente e aggiungere invece questo:

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

Questo è tutto.Tutti gli URL sono minuscoli, tratteggiati e convertiti implicitamente senza che tu faccia altro.

URL del progetto open source: https://github.com/AtaS/lowercase-dashed-route

Ecco cosa ho fatto utilizzando le aree in ASP.NET MVC 5 e ha funzionato a meraviglia.Non ho nemmeno dovuto rinominare le mie visualizzazioni.

In RouteConfig.cs, esegui questa operazione:

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

        // routes.MapRoute...
    }

Nel tuo controller, aggiungi questo prima della definizione della classe:

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

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

L'URL visualizzato nel browser se si esegue il test sul computer locale è: localhost/area-campione/mia-azione.Non è necessario rinominare i file di visualizzazione o altro.Ero abbastanza soddisfatto del risultato finale.

Dopo aver abilitato gli attributi di routing, puoi eliminare tutti i file di registrazione dell'area di cui disponi, ad esempio SampleAreaRegistration.cs.

Questo articolo mi ha aiutato a giungere a questa conclusione.Spero che ti sia utile

Asp.Net MVC 5 supporterà il routing degli attributi, consentendo un controllo più esplicito sui nomi delle route.L'utilizzo di esempio sarà simile a:

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

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

Per ottenere questo comportamento per i progetti che utilizzano Asp.Net MVC prima della v5, è possibile trovare funzionalità simili con Progetto AttributeRouting (Anche disponibile come nuget).In effetti, Microsoft ha contattato l'autore di AttributeRouting per aiutarlo con l'implementazione di MVC 5.

Potresti scrivere una route personalizzata che deriva dalla classe Route GetRouteData per eliminare i trattini, ma quando chiami le API per generare un URL, dovrai ricordarti di includere i trattini per il nome dell'azione e il nome del controller.

Non dovrebbe essere troppo difficile.

È possibile definire un percorso specifico come:

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

Ma questo percorso deve essere registrato PRIMA il tuo percorso predefinito.

Se hai accesso al modulo Riscrittura URL di IIS ( http://blogs.iis.net/ruslany/archive/2009/04/08/10-url-rewriting-tips-and-tricks.aspx ), puoi semplicemente riscrivere gli URL.

Le richieste a /my-controller/my-action possono essere riscritte in /mycontroller/myaction e quindi non è necessario scrivere gestori personalizzati o altro.I visitatori ricevono URL carini e tu ottieni quelli che MVC può comprendere.

Ecco un esempio per un controller e un'azione, ma potresti modificarlo per renderlo una soluzione più generica:

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

Il possibile svantaggio di ciò è che dovrai cambiare il tuo progetto per utilizzare IIS Express o IIS affinché le riscritture funzionino durante lo sviluppo.

Sono ancora abbastanza nuovo in MVC, quindi prendilo con le pinze.Non è una soluzione elegante e universale, ma per me ha funzionato in MVC4:

routes.MapRoute(
    name: "ControllerName",
    url: "Controller-Name/{action}/{id}",
    defaults: new { controller = "ControllerName", action = "Index", id = UrlParameter.Optional }
);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top