Pergunta

Eu gostaria de ter traços separar palavras em minha URLs.Assim, em vez de:

/MyController/MyAction

Eu gostaria de:

/My-Controller/My-Action

Isso é possível?

Foi útil?

Solução

Você pode usar o ActionName atributo da seguinte maneira:

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

Note que você precisará, então, para chamar o arquivo de modo de Exibição "a Minha Acção.cshtml" (ou extensão apropriada).Você também vai precisar para fazer referência a "minha ação" no Html.ActionLink métodos.

Não há como uma solução simples para os controladores.

Editar:Atualização para MVC5

Habilitar as rotas global:

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

Agora com MVC5, Atributo de Roteamento foi absorvida para o projeto.Agora você pode usar:

[Route("My-Action")]

Em Métodos De Ação.

Para os controladores, você pode aplicar um RoutePrefix atributo que será aplicada a todos os métodos de ação em que o controlador:

[RoutePrefix("my-controller")]

Um dos benefícios do uso de RoutePrefix é que os parâmetros de URL também vai ser passado para qualquer métodos de ação.

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

Recorte..

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

Outras dicas

Você pode criar uma rota personalizada processador, como mostrado neste 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 a nova rota:

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

Um muito semelhante questão foi perguntado aqui: ASP.net MVC suporte para URL com hífenes

Tenho desenvolvido uma fonte aberta NuGet biblioteca para este problema, que converte implicitamente EveryMvc/Url para todos-mvc/url.

Urls maiúsculas são problemáticas, porque cookie caminhos são sensíveis a maiúsculas e minúsculas, a maioria da internet, na verdade, é sensível a maiúsculas e minúsculas, enquanto tecnologias da Microsoft trata urls como case-insensitive.(Mais no meu blog)

O Pacote Do NuGet: https://www.nuget.org/packages/LowercaseDashedRoute/

Para instalá-lo, basta abrir a janela do NuGet no Visual Studio clicando com o botão direito no Projeto e selecionando o Gerenciador de Pacotes NuGet, e sobre o "Online" tipo de separador "Minúsculas Tracejada Rota", e ele deverá aparecer.

Como alternativa, você pode executar esse código no Console do Gerenciador de Pacotes:

Install-Package LowercaseDashedRoute

Depois disso, você deve abrir App_Start/RouteConfig.cs e comentar rota existente.MapRoute(...) a chamada e adicione isso:

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

É isso.Todos os urls são minúsculas, tracejada, e convertido implicitamente, sem você fazer nada de mais.

Projeto Open Source Url: https://github.com/AtaS/lowercase-dashed-route

Aqui está o que eu fiz usando áreas ASP.NET MVC 5 e funcionou gostei um charme.Eu não tenho que mudar o nome da minha vista.

Em RouteConfig.cs, faça isso:

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

        // routes.MapRoute...
    }

Em seu controlador, adicionar isso antes da definição de classe:

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

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

A URL que aparece no browser se o teste na máquina local é: localhost/amostra-área/meu-ação.Você não precisa mudar a sua visão de arquivos ou qualquer coisa.Eu estava muito feliz com o resultado final.

Depois de encaminhamento atributos são ativados você pode excluir qualquer área de registro de ficheiros, tais como SampleAreaRegistration.cs.

Este artigo me ajudou a chegar a esta conclusão.Espero que seja útil para você.

Asp.Net MVC 5 apoio atributo de roteamento, permitindo mais controle explícito sobre a rota de nomes.Exemplo de uso terá a seguinte aparência:

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

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

Para obter este comportamento para projectos de Asp.Net MVC antes v5, funcionalidade semelhante pode ser encontrado com a AttributeRouting projeto (também disponível como um nuget).Na verdade, a Microsoft estendeu a mão para o autor do AttributeRouting para ajudá-los com sua implementação MVC 5.

Você poderia escrever uma rota personalizada que deriva da classe de roteamento GetRouteData a faixa de traços, mas quando você chamar as APIs para gerar uma URL, você vai ter que se esqueça de incluir os hífens para o nome da ação e o nome do controlador.

Que não deve ser demasiado duro.

Você pode definir uma rota específica, tais como:

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

Mas este percurso tem de ser registada ANTES de sua rota padrão.

Se você tiver acesso ao IIS URL Rewrite module ( http://blogs.iis.net/ruslany/archive/2009/04/08/10-url-rewriting-tips-and-tricks.aspx ), você pode simplesmente reescrever as URLs.

Pedidos /meu-controlador/meu-a ação pode ser reescrito para /mycontroller/myaction e, em seguida, não é necessário escrever personalizado manipuladores ou qualquer outra coisa.Os visitantes têm muito urls e você terá queridos MVC pode entender.

Aqui está um exemplo de um controlador e ação, mas você pode modificar para ser mais genérico solução:

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

A possível desvantagem é que você vai ter que mudar o seu projeto para usar o IIS Express ou o IIS para reescrita de trabalho durante o desenvolvimento.

Eu ainda sou muito novo para MVC, para tomar com um grão de sal.Não é um hotel elegante, pega-todas solução, mas fez o truque para me MVC4:

routes.MapRoute(
    name: "ControllerName",
    url: "Controller-Name/{action}/{id}",
    defaults: new { controller = "ControllerName", action = "Index", id = UrlParameter.Optional }
);
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top