2009-10-20 18 views
5

Global.asax'da tanımladığım yolları kullanarak ilgili URL'nin denetleyici adını nasıl alabilirim?ASP.NET-MVC. Denetleyici adını bir url'den nasıl edinebilirim?

Örnek:

Böyle bir rota defiend varsa: dize "~/tr/products/liste" Ben ürünleri (kontrolör adı) olmasını istediğiniz dan

routes.MapRoute(
       "Default",            // Route name 
       "{language}/{controller}/{action}/{id}",     // URL with parameters 
       new { controller = "Home", action = "Index", id = "", language = "en" } 

. Bunu zaten yapan mevcut herhangi bir yöntem var mı?

+1

Bu yer nerede olacak? –

+0

UrlHelper – Gregoire

+0

'u genişletecek bir yardımcı sınıfta https://stackoverflow.com/questions/8830052/how-do-i-get-the-controller-and-action-names-from-the-referrer-uri –

cevap

4

Bkz Stephen Walther blog yazısı ASP.NET MVC Tip #13 – Unit Test Your Custom Routes

MvcFakes projesinin eski bir System.Web.Abstractions başvurusu vardır. Yani, 'u yenisiyle değiştirmeli ve MvcFakes.dll dosyasını almak için projeyi yeniden derlemelisiniz.

Bu benim kodudur: Yukarıdaki Benim kod

public string getControllerNameFromUrl() 
{ 
    RouteCollection rc = new RouteCollection(); 
    MvcApplication.RegisterRoutes(rc); 
    System.Web.Routing.RouteData rd = new RouteData(); 
    var context = new FakeHttpContext("\\" + HttpContext.Request.Url.AbsolutePath); 
    rd = rc.GetRouteData(context); 
    return rd.Values["action"].ToString(); 
} 

"MvcApplication" Global.asax sınıf adıdır.

İyi şanslar!

+0

Teşekkürler, deneyeceğim. – Gregoire

+0

Stephen Walther'in yukarıdaki blog linki hala çalışıyor. Ancak, bir kez onun sitesinde, indirme linki başarısız olur ve İpucu # 12 için bağlantı da başarısız olur - bu yüzden 'FakeHttpContext' sınıfının bir listesini alamıyorum. Benzer işlevsellik elde etmek için başka yerler biliyor musunuz? – Zarepheth

+0

İpucu # 12 burada: http://stephenwalther.com/archive/2008/07/01/asp-net-mvc-tip-12-faking-the-controller-context – VeeTheSecond

1

Ne sorduğundan emin değilim, bu yüzden cevabım yanlışsa, istediğim şeyi tahmin ediyorum.

Global.asax ürününüze her zaman başka bir rota ekleyebilirsiniz. Bu genellikle 'norm dışında' vakalarla uğraşmanın en kolay yolu. varlığın birden fazla türü bu kullanacağız eğer

routes.MapRoute(
      "ProductList",   
      "{language}/{products}/{action}/", 
      new { controller = "Products", action = "List", language = "en" }); 

Ayrıca daha genel {controller} ürünler yerine yapabilirsiniz: ürünlerin listesini dönmek isterseniz

, bu yolu kullanacağız rota. İhtiyaçlarınız için değiştirmelisiniz.

Örneğin, bu Herhangi bir ürün listesini almak için kullanabileceği genel bir rota yapmak:

routes.MapRoute(
      "ProductList",   
      "{language}/{controller}/{action}/", 
      new { controller = "Products", action = "List", language = "en" }); 

ne yapar o her zaman Default önce yerleştirmek gerektiğini (bir rota oluşturur olmasıdır rota), "Kullanıcı ne girerse, bana istediği kontrolörü ve eylemi ver" yazıyor. (/en/Products/List veya /en/Users/List gibi).

Bu denetleyiciyi ziyaret etmek için, aşağıdakilere gitmeniz yeterlidir: yoursite.com/en/products/list. Denetleyiciyi ziyaret etmek için HTMLActionLink'u da kullanabilirsiniz.

<%=Html.ActionLink("Product", "List", new { controller = Products }, null) %>

benim IDE açık olmadan bu yazıyorum, bu nedenle ActionLink da içinde bir hata olabilir.

Muhtemelen George gibi başka rota önerir ama eklemek gerekir
+1

için teşekkürler Bana cevap vermek için zaman ayırdığınız, ama aradığım şey bir "ters" GetRoute işlevi, yani bir url (geçerli olanı değil), denetleyici adı – Gregoire

+0

@Gregoire Great, uh elde etmek mümkün olmak istiyorum, Bunu neden en başta söylemedin? –

+0

Üzgünüm ama bir hata yaptım çünkü yeterince temiz olduğuna inandım – Gregoire

6

Eğer gerçekten sadece size denetleyicisi eylem yöntemleri yapabilirsiniz rota türetilen denetleyici değerini gerekirse:

var controller = (string)RouteData.Values["controller"]; 
+1

Nasıl RouteData'dan değil, rastgele bir url'den contrller ismini alabilirim? – Gregoire

+0

@Gregoire? Sitenizde veya bir başkasının rasgele bir URL'sini mi kastediyorsunuz? Sitenizde ise size nasıl olduğunu söyledi. –

+1

Hayır, sadece geçerli URL için çalışacağım, eğer bir hata yapmazsam (Http geçerli bağlamında çalışır) – Gregoire

İlgili konular