Pregunta

Tenemos un sitio web que trata con artistas y lugares y lo estamos desarrollando en ASP.net MVC.

Tenemos las vistas de nuestros artistas en una carpeta (Vistas / Artistas / ..), un ArtistsController, ArtistsRepository y nos adherimos a los nombres de acción REST, como Mostrar, Nuevo, Eliminar, etc.

Cuando nos burlamos del sitio por primera vez, todo funcionó bien en nuestro entorno de prueba, ya que nuestras URL de prueba eran / artists / Show / 1209 pero debemos cambiar esto para que el sitio web aparezca como / artistas / Madonna y / artistas / Foo-Fighters, etc.

Sin embargo, ¿cómo podemos distinguir entre nombres de artistas válidos y los nombres de las acciones para ese controlador? Por ejemplo, artistas / PostComment o artistas / DeleteComment? Necesito permitir que el enrutamiento maneje esto. Nuestra ruta predeterminada de Mostrar es:

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

Una forma de evitar esto es que nuestro sitio web se ejecute visiblemente en / artists, pero que nuestro controlador cambie su nombre a singular - ArtistController - en lugar de ArtistsController. Eso iría en contra de las convenciones de nomenclatura con las que fuimos cuando empezamos (¡pero hey!).

¿Tienes alguna otra recomendación? De ser posible, también podríamos encaminar en función de los verbos (por lo tanto, PostComment sería un POST, por lo que quizás podríamos encaminar a esa acción), pero no estoy seguro de que sea aconsejable y mucho menos posible.

Gracias

¿Fue útil?

Solución

El cuarto parámetro de MapRoute le permite especificar restricciones para los valores. Puede agregar una ruta antes de esta que es para " artistas / {acción} / {id} " con una restricción en los valores válidos para la acción; al no coincidir con una de sus acciones, caerá en la siguiente ruta que coincidirá con el nombre del artista.

Otros consejos

Realmente definirías múltiples rutas ... las acciones definidas en tu controlador irían primero con el valor predeterminado en la parte inferior. Me gusta pensar en las definiciones de ruta como una "gran" instrucción de conmutación ole " donde la primera regla satisfecha gana ..

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 bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top