2009-12-18 86 views
9

我希望能夠從RouteCollection生成URL而無需訪問HttpContext。查看RouteCollection的實現方式,所有方法都需要訪問RequestContext以獲取虛擬路徑。ASP.NET MVC - 生成沒有Http /請求上下文的路由

我已經通過嘲笑HttpContext解決了這個問題,但是這增加了對RhinoMocks的尷尬依賴,並不是一個合理的解決方案。除了上下文之外,還有其他選項可用於生成Url嗎?

回答

1

對不起,但習慣了在MVC框架中嘲笑。一旦你進入測試階段,你就會需要它。這裏有很多:HttpContext,Session,Server - 所有泄漏到控制器中的東西。如果你想生成路徑,你需要與HttpContext交談(在MVC中,這實際上是HttpContextBase,所以你可以編寫你自己的具體實現,我猜),或者你需要嘲笑它。

+1

我不反對嘲笑測試情況。但是,我沒有在測試中這樣做。我正在通過異步服務生成電子郵件。由於它是異步的,因此無法訪問HttpRequest。 – bromanko 2009-12-18 22:43:14

+0

假設一個行動正在開始生成電子郵件的過程。嘗試在動作中(當你有權訪問RequestContext時)進行路由調用,然後將結果傳遞給生成電子郵件的任何進程。 – Levi 2009-12-18 22:51:53

+0

有些情況下,電子郵件是在沒有網絡的情況下生成的。例如,每天的電子郵件或提醒電子郵件。 – bromanko 2009-12-19 16:06:28

3

確實是一個很好的問題。路由本身對於從正在運行的ASP.NET應用程序中被調用有一定的依賴性,比如獲取應用程序根URL以及URL中的任何無cookie的表單或會話cookie。雖然創建模擬對象是一個理論上的解決方案,但它肯定不推薦在運行時使用。

我的建議是在這種情況下根本不使用路由,並將URL編碼到電子郵件中。電子郵件中的鏈接必須具有完全限定的URL(主機名+路徑),路由甚至不能爲URL生成主機名,所以這是您必須硬編碼的內容。