Маршрут MVC, где существует путь - PullRequest
9 голосов
/ 27 августа 2011

Я пытаюсь создать маршрут, который будет содержать URL-адрес, подобный

http://mysite.com/tech/

, но у меня также есть фактический каталог под сайтом / tech, который содержит другие статические ресурсы.Не мой выбор дизайна, но я переношу старый сайт на mvc и не хочу ломать кучу очень старых ссылок.

Мой маршрут, кажется, продолжает сбой, и я могу понять, что сервер видит этот каталог и пытается обработать файл по умолчанию из него ... но ни один не найден, и он не работает.

Я бы хотел, чтобы вместо этого я использовал свой маршрут и позволил мне показать мой взгляд.Есть ли лучшие практики для этого?

ОБНОВЛЕНИЕ: я попытался использовать RouteExistingFiles = true, что сделало эту работу, но затем у меня возникли проблемы с файлами, которые существовали в этих каталогах.(например: http://mysite.com/tech/image.jpg). Я начал добавлять записи IgnoreRoute для всех различных типов файлов, которые я хотел игнорировать (например, файлы .jpg ..), но это превратилось в большой беспорядок. Должен быть лучший способ?

1 Ответ

14 голосов
/ 28 августа 2011

Вам необходимо установить для свойства RouteExistingFiles вашего объекта RouteCollections значение true. Это заставит вашу маршрутизацию переопределить физическое местоположение, если будет обнаружено столкновение.

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

Чтобы выборочно игнорировать файлы / расширения, вы можете использовать:

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

Другой подход, который может помочь, если вам не нравится подход ignoreRoute, - это расширение ViewEngine и переопределение реализации файла с вашими собственными правилами.

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());
...