2015-10-05 38 views
0

我想在我的項目中使用方法Html.Action()。 我有兩個項目。如何在使用Html.Action()時調用另一個程序集中的控制器?

  • 項目1 - 區 - HomeController的 - 的indexAction
  • 項目2 - 我寫一個函數幫手我的佈局使用。

    public static IHtmlString RenderTest(this HtmlHelper htmlHelper) 
    { 
        string mhs = ""; 
        mhs += htmlHelper.Action("Index", "Home", new { area = "area" }); 
        return new MvcHtmlString(mhs); 
    } 
    

項目1,我寫了一個路線圖:

context.MapRoute("area_default", 
    "Theme/{controller}/{action}/{id}", 
    new { controller = "Home", action = "Index", id = UrlParameter.Optional }, 
    namespaces: new[] { string.Format("{0}.Controllers", this.GetType().Namespace) } 
); 

我如何可以使用此功能加載控制器是在另一個組件?

Html.Action("Index","Home", new { area = "area" }); 


另外我有一個重複的控制器名稱中的每個組件,
例如Namespace1.FooControllerNamespace2.FooController

我沒有我的路線問題。另外,我可以通過URL /路由在不同的程序集中調用任何控制器。
但我不能在我的HtmlHelper.Action()中使用這些網址。
其實我想調用另一個程序集中的控制器中的動作,並將該動作的視圖作爲HtmlString處理。

+0

如果您不明白我的描述,請寫評論。 –

回答

0

如果您確定每個裝配中沒有重複的控制器名稱,例如Namespace1.FooControllerNamespace2.FooController,那麼你可以簡單地添加應該在數組中搜索namespaces參數的所有命名空間。

但是,如果您確實有重複的名稱,則路由最終會匹配多個控制器,這是一個問題。對於namespaces參數沒有任何操作順序 - 所有操作都會被搜索,並且所有操作都會被平等對待,儘管命名空間順序不變。如果是這種情況,那麼你必須定義多個路由,每個路由綁定到一個特定的命名空間。

UPDATE

其實我想調用控制器其他程序集的動作,並取得該操作的視圖HtmlString但處理。

哦。你的意思是你真的想在另一段代碼中調用像一個方法的動作,而不是通過URL訪問它?你可能使用類似WebClient的東西來實際發出請求並以字符串形式獲取響應。這可能不是最有效的方式,但它可能是最簡單的。

替代方案要複雜得多。如果這只是一個返回ViewResult的常規操作,那麼這就是您實際上從調用它的方法返回的方法。但是,從快速調試會話看來,ViewResult直到它從操作返回並返回到流水線(不只是另一個操作)之後纔會被處理。因此,您所得到的只是一個具有要使用的視圖名稱的對象以及應該用來呈現它的所有視圖數據,即不是您可以做任何事情的實際呈現的字符串。但是,使用類似RazorEngine的內容,您可能可以手動從ViewResult中獲取數據並對其執行任何操作。

+0

我的路線沒有問題。我可以通過URL和我的路線在不同的程序集中調用任何控制器。但是我不能在我的'helper.Action()'中使用這些url。另外我有一個像你的例子一樣的控制器。 –

+0

實際上我想在另一個程序集中的控制器中調用一個動作,並將該動作的視圖作爲HtmlString處理。 –

相關問題