Ruta MVC donde existe la ruta

Estoy tratando de crear una ruta que incluirá un título de una URL como

http://mysite.com/tech/

pero también tengo un directorio real debajo del sitio que es / tech, que contiene otros recursos estáticos. No es mi elección de diseño, pero estoy migrando un sitio antiguo a mvc y no quiero romper un montón de enlaces muy antiguos.

Mi ruta parece seguir fallando, y lo que puedo imaginar es que el servidor ve este directorio y está tratando de entregar el archivo predeterminado desde él ... pero no se encuentra ninguno y falla.

Me gustaría que usara mi ruta en su lugar y me dejara ofrecer mi vista. ¿Alguna mejor práctica para esto?

ACTUALIZACIÓN: Intenté usar RouteExistingFiles = true, lo que hizo que esto funcionara, pero luego tuve problemas con los archivos que existían dentro de estos directorios. (por ejemplo: http://mysite.com/tech/image.jpg). Comencé a agregar entradas IgnoreRoute para todos los tipos de archivos que quería ignorar (es decir, archivos .jpg ...), pero esto se convirtió en un gran lío. ¿Tiene que haber una mejor manera?

preguntado el 27 de agosto de 11 a las 19:08

después de trabajar más durante el fin de semana, todavía no se encontró una solución para esto ... -

1 Respuestas

Debe establecer la propiedad RouteExistingFiles de su objeto RouteCollections en verdadero. Esto hará que su ruta anule la ubicación física si se encuentra un conflicto.

routes.MapRoute("Default", "{controller}/{action}/{id}",
        new { controller = "Home", action = "Index", id = "" }
    );
routes.RouteExistingFiles = true;

Para ignorar selectivamente archivos / extensiones, puede usar:

routes.IgnoreRoute("{*staticfile}", new { staticfile = @".*\.(css|js|gif|jpg)(/.*)?" });

Otro enfoque que puede ayudar si no le gusta el ignoreRoute enfoque, es extender ViewEngine y anular la implementación del archivo existente con sus propias reglas.

public class MyViewEngine : RazorViewEngine
{
    protected override bool FileExists(ControllerContext controllerContext, string virtualPath)
    {
        //Some Logic to check for file
    }
}

ViewEngines.Engines.Clear();
ViewEngines.Engines.Add(new CustomViewEngine());

Respondido el 01 de Septiembre de 11 a las 00:09

Encontré esto y lo intenté, pero mi problema es que hay un montón de archivos estáticos dentro de estas mismas carpetas que necesito tener accesibles. entonces, quiero que la ruta se dispare al presionar / tech, pero sirva el archivo estático al presionar /tech/image1.jpg. - Brady Moritz

así que tuve que agregar un montón de entradas de ruta ignorada para tipos de archivos estáticos ... y las cosas se pusieron realmente feas a partir de ahí. - Brady Moritz

Puede ignorar selectivamente por extensión de archivo si eso ayuda. - TheCodeKing

mi disgusto por este método es que me obliga a agregar una gran lista de tipos de archivos, y requerirá que agregue más en el futuro si se agrega un nuevo tipo de archivo. en segundo lugar, supongo que esto también podría afectar el rendimiento. ¿No hay forma de agregar un archivo. aspx en los directorios para capturar la solicitud (ya que estaría en la lista de archivos predeterminada) y devolver las cosas al motor de visualización. - Brady Moritz

Entonces, ¿qué tal el enfoque del motor de vista personalizado? No sé mucho sobre ellos todavía, pero parece que podría hacer el trabajo. - TheCodeKing

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.