2008-12-22 14 views
10

Próbuję wymyślić podejście do tworzenia "dynamicznego" routingu. Chodzi mi o to, że chcę mieć możliwość przypisania kontrolera i działania trasy dla każdego trafienia, zamiast bezpośredniego mapowania.Asp.Net MVC - Najlepsze podejście do "dynamicznego" routingu

Na przykład trasa może wyglądać jak ta "ścieżka/{obiekt}", a po trafieniu tej ścieżki wykonywane jest wyszukiwanie pod warunkiem, że odpowiedni kontroler/akcja zostanie wywołany.

Próbowałem już odkryć mechanizmy tworzenia niestandardowego programu obsługi trasy, ale dokumentacja/wykrywalność jest w tej chwili nieco zacieniona (wiem, jego wersja beta - nie oczekiwałbym więcej). Chociaż nie jestem pewien, czy to nawet najlepsze podejście i być może fabryka kontrolerów, czy nawet domyślny kontroler/akcja, która wykonuje wszystkie mapowania, może być najlepszą drogą (nie gra słów).

Każda rada byłaby doceniona.

+1

Proszę spojrzeć na tego małego instrukcji: [MVC .Net Routing] (http://stackoverflow.com/questions/379558/mvcnet-routing#379823), sekcja ** Opcja 3 ** - opisuje sposób budowania łańcucha przetwarzania żądań niestandardowych. – maxnk

Odpowiedz

3

Zawsze można użyć składni wszystkich elementów (nie mam pojęcia, czy nazwa jest poprawna).

Trasa: routeTable.MapRoute( "Path", "{*path}", new { controller = "Pages", action = "Path" });

działanie kontrolera jest zdefiniowana jako: public ActionResult Path(string path)

W akcji dla kontrolera będziesz miał ścieżkę, więc po prostu trzeba go rozlane i analizować.

Aby zadzwonić do innego kontrolera, można użyć opcji RedirectToAction (uważam, że jest to bardziej właściwy sposób). Dzięki przekierowaniu możesz ustawić dla niego stały przekierowanie. Albo użyć coś takiego:

internal class MVCTransferResult : RedirectResult 
    { 
     public MVCTransferResult(string url) : base(url) 
     { 
     } 
     public MVCTransferResult(object routeValues) 
       : base(GetRouteURL(routeValues)) 
     { 
     } 

     private static string GetRouteURL(object routeValues) 
     { 
      UrlHelper url = new UrlHelper(
       new RequestContext(
         new HttpContextWrapper(HttpContext.Current), 
         new RouteData()), 
         RouteTable.Routes); 
      return url.RouteUrl(routeValues); 
     } 

     public override void ExecuteResult(ControllerContext context) 
     { 
      var httpContext = HttpContext.Current; 

      // ASP.NET MVC 3.0 
      if (context.Controller.TempData != null && 
       context.Controller.TempData.Count() > 0) 
      { 
       throw new ApplicationException(
        "TempData won't work with Server.TransferRequest!"); 
      } 
      // change to false to pass query string parameters 
      // if you have already processed them 
      httpContext.Server.TransferRequest(Url, true); 

      // ASP.NET MVC 2.0 
      //httpContext.RewritePath(Url, false); 
      //IHttpHandler httpHandler = new MvcHttpHandler(); 
      //httpHandler.ProcessRequest(HttpContext.Current); 
     } 
    } 

metoda ta wymaga jednak do uruchomienia na IIS lub IIS Expres Casinni nie wspiera metodę Server.Transfer

+0

Czy wiesz, dlaczego musimy sprawdzić dane w TempData przed wywołaniem TransferRequest? – yurart

Powiązane problemy