2011-10-21 8 views
5

Creo que ya le pregunté esto, pero la solución realmente no tenía sentido. De todos modos, tengo ActionLinks sobre mis puntos de vista así:mvc route actionlinklink url use name en lugar de id

foreach(var item in Model){ 
<%: Html.ActionLink(item.Name, "Details", new {id = item.Id}) %> 
} 

ahora, cuando se va a mi Información de la acción, obviamente, esta será la url

/MyThings/Details/{id} 

Me preguntaba si es posible mostrar la nombre de ese elemento en lugar de la identificación ¿Usar una babosa? o modificar el GLOBAL.ASAX así:

/MyThings/Details/CarKeys 

La cosa es que los nombres tienen que ser único, ¿hay alguna manera de modificar el GLOBAL.ASAX para mostrar el nombre en lugar del ello?

¡Cualquier consejo es muy apreciado!

Respuesta

6

Seguro, solo tiene que cambiar sus reglas de enrutamiento. Buscar en su archivo Global.asax.cs, o en el archivo de registro de área, para algo como esto:

routes.MapRoute(..., "{controller}/{action}/{id}", ...); 

... y cambiarlo a algo como esto:

routes.MapRoute(..., "{controller}/{action}/{name}", ...); 

Después haga que su acción tomar el nombre en lugar de la ID:

Html.ActionLink(item.Name, "Details", new {item.Name}) 
+0

sí, pero ¿esto tendrá que cambiar las consultas que llega al controlador correcto? por lo tanto, de Public ActionResult Details (int id) a public ActionResult Deatils (nombre de cadena). Estaba tratando de evitar eso, pero si no hay ninguna opción, entonces supongo que ese es el camino a seguir. – gdubs

+0

Depende. ¿El parámetro '{id}' de su controlador espera un nombre? si es así, simplemente 'nuevo {id = item.Name}' – Buildstarted

+0

@gdubs: Sí, si vas a identificar cosas por su nombre, obviamente necesitarás usar una consulta diferente a la que estás identificando por su ID. Hay algunos trucos de enlace avanzados que puede utilizar para evitar esto, pero yo diría que debería hacerlo simple. Si desea la conveniencia de la ID, pero también desea incluir el nombre para que se vea bien, simplemente incluya ambos, como Malevolence, señalando. – StriplingWarrior

8

Si esto es solo para fines de SEO, solo incluya tanto la ID como el Nombre. El nombre será parte de la URL pero no será utilizado por su aplicación. Simplemente agregue otra ruta que use la plantilla: {controller}/{action}/{id}/{name}

También querrá transformar su nombre para asegurarse de que solo tiene caracteres válidos para las direcciones URL. Hay toneladas de artículos sobre esto en la red y es bastante simple. Aquí hay un ejemplo: http://chrismckee.co.uk/creating-url-slugs-permalinks-in-csharp/

+0

bueno, es más para una mejor experiencia del usuario, tome el ejemplo de rottentomatoes.com , si hago clic en un enlace >> http://www.rottentomatoes.com/m/the_ides_of_march/, me dirigirá a ese registro en el m controlador. Estaba pensando que probablemente usaron ese título como clave en el disco. ¿no? y gracias por el enlace por cierto! – gdubs

Cuestiones relacionadas