Pergunta

Temos um site que lida com artistas e locais e estamos desenvolvendo-o em ASP.net MVC.

Nós temos nossos pontos de vista artista em uma pasta (Vistas / Artistas / ..), um ArtistsController, ArtistsRepository e aderir aos nomes de ação RESTO como Show, New, Delete etc.

Quando ridicularizado pela primeira vez o site, tudo funcionou bem em nosso ambiente de teste como nossos URLs de teste foram / artistas / show / 1209 mas precisamos mudar isso para que seja exibido ao site como / artistas / Madonna e / artistas / Foo-Fighters etc

No entanto, como podemos distinguir entre nomes de artistas válidos e os nomes das ações para que o controlador ?! Por exemplo, os artistas / Postcomment ou artistas / Deletecomment? Eu preciso para permitir o encaminhamento para lidar com isso. Nosso padrão Mostrar percurso é:

routes.MapRoute(
               "ArtistDefault",
               "artists/{artistName}",
               new { controller = "Artists", action = "Show", artistName = ""}

Uma maneira de contornar isso é para o nosso site para visivelmente executado em / artistas, mas ter o nosso controlador renomeado para o singular - ArtistController - em oposição a ArtistsController. Isso iria contra as convenções de nomenclatura Nós fomos com quando começamos (mas hey!).

Você tem outras recomendações? Se possível, poderíamos também rota dependendo dos verbos (assim Postcomment seria um POST para que pudéssemos talvez rota para que a ação), mas eu não tenho certeza se isso é deixar aconselhável sozinho possível.

Graças

Foi útil?

Solução

A 4ª parâmetro para MapRoute permite especificar restrições para valores. Você pode adicionar uma rota antes deste que é para "artistas / {ação} / {id}" com uma restrição os valores válidos para a ação; deixando de corresponder a uma das suas ações, ele vai cair para a próxima rota que irá coincidir com o nome do artista.

Outras dicas

Você seria realmente definir várias rotas ... as ações definidas em seu controlador iria primeiro com o padrão sendo na parte inferior. Eu gosto de pensar de definições de rota como um "grande 'switch ole", onde primeira regra satisfeito vitórias ..

routes.MapRoute(
               "ArtistPostComment",
               "artists/PostComment/{id}",
               new { controller = "Artists", action = "PostComment", id = "" }
);
routes.MapRoute(
               "ArtistDeleteComment",
               "artists/DeleteComment/{id}",
               new { controller = "Artists", action = "DeleteComment", id = "" }
);
routes.MapRoute(
               "ArtistDefault",
               "artists/{artistName}",
               new { controller = "Artists", action = "Show", artistName = "" }
);               
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top