Pergunta

Eu gostaria de ter URLs ainda mais curtos que/{controller}/{action}/{id}.

Por exemplo, eu gostaria de {controlador}/{id}, onde {id} é uma string.

Isso permitiria caminhos simples, por exemplo, usuários/nome de usuário, páginas/nome de pagenos, notícias/notícias. Gosto mais disso do que exigir a ação/Detalhes no URL (Usuários/Detalhes/Nome de UserNe), que é menos elegante para o usuário final.

Posso fazer isso facilmente funcionar configurando rotas personalizadas para qualquer controlador para o qual eu queira esse nível de simplicidade. No entanto, isso causa dores de cabeça quando se trata de implementar outras ações, como {controlador}/{action}, onde {action} = 'create', pois, neste caso, a string {action} entra em conflito com a string {id}.

Minha pergunta: como posso ter palavras 'reservadas', de modo que, se o URL for /notícias /criar, ele é tratado como uma ação, mas se o URL for mais alguma coisa, por exemplo, notícias /a-gorilas tese, então é tratada como um id.

Espero poder definir isso ao configurar minhas rotas?

Atualizar:

Usando a resposta de Ben Griswold, atualizei as rotas padrão do ASP.NET MVC:

    routes.MapRoute(
    "CreateRoute",                                            // route name
    "{controller}/Create",                                    // url with parameters
    new { action = "Create" }                                 // parameter defaults
);

routes.MapRoute(
    "DetailsRoute",                                           // route name
    "{controller}/{id}",                                      // url with parameters
    new { action = "Details" }                                // parameter defaults
);

routes.MapRoute(
    "Default",                                              // Route name
    "{controller}/{action}/{id}",                           // URL with parameters
    new { controller = "Home", action = "Index", id = "" }  // Parameter defaults
);

Isso funciona um charme e significa, por padrão, as páginas de detalhes usarão o URL simplificado, mas ainda poderei direcionar uma ação específica, se quiser (atualizar/excluir/detalhes).

Obviamente, você precisará proibir a palavra "Criar" reservada como um ID, caso contrário, um usuário poderá tentar criar um artigo, por exemplo, com o nome "Create", que nunca pode ser acessado.

Isso é muito bom. Se alguém vê que há algo errado com essa abordagem, o Chime entra, mas eu gosto até agora.

Foi útil?

Solução

Eu acho que você fica criando uma rota para cada palavra reservada. Por exemplo,

routes.MapRoute("CreateRoute",
               "{controller}/Create",
                new { action = "Create" }
            );

Lidaria com /notícias /criar, /usuários /criar, etc. Desde que essa rota esteja listada antes da sua outra rota personalizada, acho que você está coberto.

Eu imagino que você precisará de rotas adicionais para várias operações do CRUD que seguirão um padrão semelhante.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top