2010-05-21 115 views
1

在我目前的項目中,我們有一個通知系統。當一個對象被添加到另一個對象集合中時,電子郵件被髮送給那些被父對象所子集的對象。這發生在對象層而不是視圖或控制器中。MVC路由 - 如何獲取URL?

這裏的問題:

雖然我們不能說誰什麼跟什麼信息在電子郵件中,我們不能嵌入鏈接到郵件的對象創建的,因爲對象層中有一個UrlHelper進不去。要構建一個UrlHelper,您需要一個RequestContext,它在對象層上也不存在。

問:

我想打一個輔助類來創建網址的我。我如何創建一個沒有請求上下文就會生成這些url的對象?可能嗎?

+0

我目前正在研究asolution,我將一個函數傳遞給生成url的對象。完成後,我會發布我的解決方案。 感謝偉大的想法! – 2010-05-21 20:04:22

回答

0

您可以定義與需要的任何信息,需要創建一個URL(對象ID或其他),並返回一個URL的方法的接口。編寫一個使用UrlHelper執行此工作的接口的實現,然後將其提供給對象層(理想情況下使用IoC容器)。

1

我不知道的方式做到這一點,你必須訪問路由至少是使自己的幫手。除非您的業務對象知道註冊路線,否則您無法脫離一些硬編碼。

這裏是你會如何限制網址雖然的硬編碼...

代碼與在對象的方法的所有相關位的網址..

class Event 
    { 
     public void SendEmail() 
     { 
      var url = string.Format("http://myurl.com/r/Event?eventId={0}", EventId); 
      //send emails... 
     } 
    } 

注意/r/Event件的網址。這將是一個RController的地圖,它將負責採取任意的,組成的鏈接併發送301 Permanent Redirect並通過路徑引擎使用當前路線創建真實的網址。通過這種方式,您只是對實用程序控制器url進行硬編碼,而不是對真實頁面的不斷髮展的控制器操作。

class RController : Controller 
{ 
    public ActionResult Event(int eventId) 
    { 
     Response.StatusCode = (int)HttpStatusCode.MovedPermanently; 
     Response.RedirectLocation = Url.Action("Details", "Event", new { eventId = eventId }); 
     return null; 
    } 

    public ActionResult Register(int eventId) 
    { 
     Response.StatusCode = (int)HttpStatusCode.MovedPermanently; 
     Response.RedirectLocation = Url.Action("Register", "Event", new { eventId = eventId }); 
     return null; 
    } 
} 

它只是感覺比硬編碼一堆不同的控制器/行動,你可能會決定稍後重命名一點。把它看作你自己的小TinyUrl就像服務一樣。

2

的問題是事實,你不希望在電子郵件中的相對URL複合,你想要一個絕對的電子郵件,所以你需要硬編碼的域名也因爲沒有發出請求,抓住它。

另一個因素是,電子郵件可以在幾個月或幾年內超過當前網站結構,因此您需要一種永久鏈接,從而將多個網址與單個操作(附加路線)相關聯。後一個問題也是SEO中的一個因素,您不想留下任何頁面。

現在,您的控制器上的靜態方法UrlToActionX(params)坐在方法ActionX旁邊似乎是最簡單的解決方法。它所做的只是在強類型參數的id上使用適當的string.Format(...)來生成永久Url。在用戶對象的前端或域中添加一個靜態域(因爲您知道他們訪問您的網站時訪問哪個域),並且您有電子郵件鏈接。

這並不理想,但至少您現在只有一個地方來維護Url的生成。

恕我直言:當涉及到不斷變化的網站的永久鏈接有時候最好依靠「配置超過約定」。 :-)

+0

我已經確定了域問題。這部分很容易。 – 2010-05-21 20:02:54

0

你可以使用:

VirtualPathUtility.ToAbsolute(string.Format("~/r/Event?eventId={0}", id)) 

解析URL。儘管如此,仍然不好。