2008-12-22 26 views
10

"Dinamik" yönlendirme oluşturmak için bir yaklaşım geliştirmeye çalışıyorum. Tam olarak ne demek istediğim, doğrudan eşleştirmekten ziyade, denetleyiciyi ve her vuruş için bir rotanın eylemini atamak istediğimdi.Asp.Net MVC - "Dinamik" yönlendirme için en iyi yaklaşım

Örneğin, bir rota "yol/{nesne}", bu gibi görünebilir ve bu yolu çarpıldığında, bir arama aramak için uygun bir kumanda/eylemi temin gerçekleştirilir.

Özel bir rota işleyicisi oluşturmak için mekanizmalar keşfetme denedim ama dokümantasyon/keşfedilebilirlik anda biraz gölgeli (biliyorum, onun beta - Artık beklemek olmaz). Her ne kadar, en iyi yaklaşımın ve belki de bir denetleyici fabrikasının, hatta tüm eşleştirmeleri gerçekleştiren bir varsayılan denetleyici/eylemin bile, gidilecek en iyi yol (hiç amaçlanmayan) olabileceğinden emin değilim.

Herhangi bir tavsiye memnuniyetle karşılanacaktır.

+1

bu küçük kılavuzuna bir göz atın lütfen bir Server.Transfer yöntemini destekleyen değildir: [MVC .Net Yönlendirme] (http://stackoverflow.com/questions/379558/mvcnet-routing#379823), bölüm ** Seçenek 3 ** - özel istek işleme zincirinizin nasıl oluşturulacağını açıklar. – maxnk

cevap

3

Her zaman bir yakalayacağım bütün sözdizimi (isim doğru ise hiçbir fikrim yok) kullanabilir.

Rota: yüzden sadece dökülen ve analiz etmek için var, bir yol olacak denetleyicisi için eylem olarak public ActionResult Path(string path)

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

Kontrolör eylemi olarak tanımlanır.

Bir RedirectToAction (Bu daha doğru bir yol olduğunu düşünüyorum) kullanabilir başka bir denetleyici çağırın. Yönlendirme ile bunun için kalıcı bir yeniden yönlendirme ayarlayabilirsiniz. Ya böyle bir şey kullanın:

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); 
     } 
    } 

Ancak bu yöntem IIS veya IIS Expres Casinni çalıştırmak için ihtiyaç

+0

TransferRequest'i aramadan önce neden TempData'da veri kontrol etmemiz gerektiğini biliyor musunuz? – yurart

İlgili konular