2012-11-20 41 views
0

我想在控制器的構造函數生成URL時,有一個問題ASP.NET MVC路徑URL中的控制器構造

private BreadCrumbItem breadCrumbItem; 

    public SummaryController() 
    { 
     this.breadCrumbItem = new BreadCrumbItem { Title = "Sommaire", Url = Url.RouteUrl(new { controller = "Summary", action = "Index" }) }; 

    } 

的問題是在Url.RouteUrl

我爲什麼不能訪問此在控制器中?有任何解決這個問題的方法嗎 ? 另外,我必須在此控制器的所有操作中添加相同的代碼。

感謝您的幫助

回答

4

如果我明白你的問題的權利,你想是這樣的:在每一個方法,你可以簡單地使用CrumbItem並在第一時間它會創建新的

public class SummaryController 
{ 
    public SummaryController() 
    { 

    } 

    private BreadCrumbItem _breadCrumbItem = null; 

    private BreadCrumbItem CrumbItem 
    { 
     get 
     { 
      if(_breadCrumbItem == null) 
      { 
        _breadCrumbItem = new BreadCrumbItem { Title = "Sommaire", Url =  Url.RouteUrl(new { controller = "Summary", action = "Index" }) }; 
      } 

      return _breadCrumbItem; 
     } 
    } 
} 

現在在BreadCrumItem之後,它會在每次調用它時返回創建的項目。

+0

很不錯的主意,但我需要做的是取決於至極的動作被稱爲 –

+0

但是,如果你需要改變在每個動作的參數,那麼你就需要調用或者只是修改此數據不同的邏輯每個動作。那麼你可以寫一個只需要幾個參數的方法,併爲你構建這個BreadCrumItem。但由於這是一個非常小的和平代碼,並不是必需的 – middelpat

+0

CrumbItem應該是一個屬性嗎?你錯過了'get'塊。 –

2

您可以在控制器中訪問它,但無法在構造函數中訪問它。這個值在調用構造函數時沒有設置,顯然,因爲它在控制器構建器創建控制器之後填充它。使用@middelpat解決方案來延遲加載屬性(在當前操作中首次使用時創建它)是解決該問題的合理解決方案。 UrlHelper實例應該在控制器中可用。

+0

謝謝你的回答,關於ASP.NET MVC頁面生命週期的任何文檔都將被認可。 –

+0

@riadh_vmc http://stackoverflow.com/questions/460145/what-is-the-page-lifecycle-of-an-asp-net-mvc-page-compared-to-asp-net-webform此外,它只是除非你自己設置實例屬性,否則在構造函數中不會設置實例屬性。 MVC並不神奇,即使框架必須在可以設置任何實例屬性之前調用類構造函數。 – tvanfosson

0

我認爲你需要像這樣的答案:

https://stackoverflow.com/a/700357/637425

報價:

如果你只是想獲得的路徑一定作用,使用UrlHelper:
UrlHelper u = new UrlHelper(this.ControllerContext.RequestContext); 
string url = u.Action("About", "Home", null);
如果你想創建一個 超鏈接:
string link = HtmlHelper.GenerateLink(this.ControllerContext.RequestContext, 
System.Web.Routing.RouteTable.Routes, "My link", "Root", "About", 
"Home", null, null);
智能感知將會給你每個參數的含義 。
+0

'this.ControllerContext'在控制器的構造函數中也是'null'。 – djs

+0

@djs然後使用'HttpContext.Current.Request。RequestContext'來訪問請求上下文 – SynerCoder

1

您可以覆蓋Initialize()方法。一旦基礎控制器初始化,將會設置Url屬性。

protected override void Initialize(RequestContext requestContext) 
{ 
    // the controller's UrlHelper is still null 
    base.Initialize(requestContext); 

    // the controller's UrlHelper is now ready to use! 
    var url = Url.RouteUrl(...); 
} 
+0

謝謝,這對我有幫助! – Winson