2010-03-27 32 views
9

He visto ASP.Net MVC routing legacy URLs passing querystring Ids to controller actions y varias otras publicaciones similares para el enrutamiento de URL heredado, pero no puedo pasar el error "El RouteData debe contener un elemento denominado 'controller' con un non- valor de cadena vacía ". Al ver esto en línea no me dio ninguna pista para resolver mi problema.Reescritura de URL heredada con parámetros de cadena de consulta

He implementado la clase Legado de enrutamiento se describe en el enlace de arriba, y esto es lo que he definido en la tabla de enrutamiento:

 routes.Add(
      "Legacy", 
      new LegacyRoute("fooref.aspx", 
      "FooRef", 
      new LegacyRouteHandler()) 
     ); 

     routes.MapRoute(
      "FooRef", 
      "{controller}/{action}", 
      new 
      { 
       controller = "Home", 
       action = "Index", 
       foo_id = UrlParameter.Optional, 
       bar_id = UrlParameter.Optional 
      } 
     ); 

Cuando uso depurador ruta de Phil Haack, indica que fooref .aspx tiene una coincidencia, pero cuando desactivo el depurador de ruta, aparece el error anterior. Si reverso el orden de extracto, obtengo "Recurso no encontrado" para /ctprefer.aspx, lo cual tiene sentido, por lo que parece estar encontrando eso como una ruta válida cuando se coloca en el otro orden.

¿Dónde debo declarar que falta esta referencia de controlador?

¿Se han modificado los requisitos de enrutamiento para ASP.NET MVC 2 RTM?

+0

¿Sigue siendo una pregunta válida o fue temporal? ¿Encontraste alguna solución? – jcolebrand

+0

No, todavía no he encontrado una solución. Quizás MVC 3 me permite resolverlo. No he vuelto a mirar esto por un tiempo. –

Respuesta

2

La solución a esto es usar un IHttpHandler directamente, en lugar de un MVCHandler. He publicado el código que funciona con MVC 3 a mi blog: http://www.olsonsoft.com/blogs/stefanolson/post/Handling-Legacy-Urls-in-AspNet-MVC-3.aspx

... Stefan

+0

Gracias, Stefan. Esto se ve interesante. No estoy seguro de que funcione con un enfoque basado en datos a la dirección de la url, pero parece que funciona para listas preestablecidas. No sé cuándo podré volver a trabajar en esto, pero parece que lo que usted escribió debería funcionar, basado solamente en la lectura del código. Voy a marcar esto como la respuesta aceptada y si vuelvo a trabajar en este código, le daré una prueba completa. –

0

Es posible que desee echar un vistazo a URL Rewrite module para IIS. Se puede usar para traducir URL heredada a sus nuevas URL MVC sin "contaminar" su aplicación con rutas heredadas.

No sé si se adaptará a su solución, pero vale la pena tener una alternativa.

+0

Jakub, gracias por la sugerencia. Soy consciente de esta funcionalidad. Estaba buscando algo controlado en el nivel de la aplicación web en lugar del nivel del servidor, ya que esta aplicación web puede estar alojada en otros servidores IIS en el futuro que no sería administrada por mi equipo. –

Cuestiones relacionadas