2011-01-13 9 views
9

Mam więc trasą jak to w moim MVC 3 aplikacji działających pod kontrolą IIS 7:MVC routingu, gdy plik rzeczywiście istnieje w podanej lokalizacji

routes.MapRoute(
       "VirtualTourConfig", 
       "virtualtour/config.xml", 
       new { controller = "VirtualTour", action = "Config" } 
       ); 

Sztuką jest to, że plik rzeczywiście istnieje w/VirtualTour/config.xml. Wygląda na to, że żądanie polega właśnie na zwrocie pliku xml w tej lokalizacji, zamiast uderzać w trasę, która przetwarza kod XML, wprowadza pewne zmiany i zwraca niestandardowy XmlResult.

Jakieś sugestie, w jaki sposób mogę poinformować moją aplikację, aby trafiła na trasę, a nie faktyczny plik w przypadku, gdy plik istnieje na dysku?

EDIT: Wydaje się, że mogę używać routes.RouteExistingFiles = true; w metodzie RegisterRoutes z Global.asax powiedzieć aplikację ignorować plików na dysku. To jednak ustawia flagę globalnie i powoduje wiele innych żądań w aplikacji. Na przykład nadal chcę wywoływać plik /assets/css/site.css, aby zwrócić plik CSS bez konieczności konfigurowania tras dla każdego zasobu statycznego. Więc teraz pojawia się pytanie, czy istnieje sposób, aby to zrobić na podstawie trasy?

+3

I nie sądzę, że istnieje prosty sposób na osiągnięcie tego celu. Dlaczego po prostu nie przeniesiesz pliku statycznego do folderu '~/App_Data'? –

Odpowiedz

6

Jak dotąd najlepszą odpowiedzią na to, że znalazłem, jest zastosowanie globalnie routes.RouteExistingFiles=true, a następnie wybiórcze zignorowanie tras, które chcę przekazać do istniejących plików, takich jak .js, .css, itp. Więc skończyło się na czymś podobnym to:

public static void RegisterRoutes(RouteCollection routes) 
     { 
      routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 
      routes.IgnoreRoute("*.js|css|swf"); 
      routes.RouteExistingFiles = true; 

      routes.MapRoute(
       "VirtualTourConfig", 
       "virtualtour/config.xml", 
       new { controller = "VirtualTour", action = "Config" } 
       ); 
} 

Jeśli ktoś ma lepsze rozwiązanie, chciałbym go zobaczyć. Wolałbym selektywnie stosować flagę "RouteExistingFIles" do poszczególnych tras, ale nie wiem, czy jest na to jakiś sposób.

0

Brak rozwiązania tutaj, tylko pomysł.

Możesz spróbować zaimplementować rozwiązanie na podstawie własnego VirtualPathProvider, które zapewni własne mapowanie ścieżek sieciowych do ścieżek systemu plików i użyje domyślnego dostawcy dla wszystkich ścieżek, którymi nie chcesz się zajmować.

0

Bardzo proste rozwiązanie, z pewnością jeśli wziąć pod uwagę odpowiedź Scotta, byłoby np routes.IgnoreRoute("templates/*.html");, routes.IgnoreRoute("scripts/*.js"); i routes.IgnoreRoute("styles/*.css");.

Daje to zarówno prostotę dostarczania ścieżek do zestawu RoutesCollection, jak i pozwala uniknąć konieczności inicjowania np. a VirtualPathProvider.

0

można spróbować UrlRewiting np

<configuration> 
    <system.webServer> 
    <rewrite> 
     <rules> 
     <rule name="VirtualTourConfig"> 
      <match url="^virtualtour/config.xml" /> 
      <action type="Rewrite" url="virtualtour/config" /> 
     </rule> 
     </rules> 
    </rewrite> 

NB Używam tego dla innego przypadków użycia (tj służąc kątową app z ASP.NET MVC) - nie testowałem czy MVC routingu występuje po przepisaniu URL-a.

W moim przypadku mam normalną trasą MVC (tj /Dashboard/ =>DashboardController.Index()), ale trzeba wszystkie ścieżki względne w Views/Dashboard/Index.cshtml służyć statycznych plików bez uzyskiwania mylić MVC routingu tj /Dashboard/app/app.module.js musi służyć plik statyczny. Używam UrlRewriting mapować /Dashboard/(.+) do /ng/Dashboard/{R:1} następująco:

<configuration> 
    <system.webServer> 
    <rewrite> 
     <rules> 
     <rule name="Dashboard"> 
      <match url="^dashboard/(.+)" /> 
      <action type="Rewrite" url="ng/dashboard/{R:1}" /> 
     </rule> 
     </rules> 
    </rewrite> 
Powiązane problemy