如何在使用Html.Action()时调用另一个程序集中的控制器?

问题描述:

我想在我的项目中使用方法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

如果您不明白我的描述,请写评论。 –

如果您确定每个装配中没有重复的控制器名称,例如Namespace1.FooControllerNamespace2.FooController,那么你可以简单地添加应该在数组中搜索namespaces参数的所有命名空间。

但是,如果您确实有重复的名称,则路由最终会匹配多个控制器,这是一个问题。对于namespaces参数没有任何操作顺序 - 所有操作都会被搜索,并且所有操作都会被平等对待,尽管命名空间顺序不变。如果是这种情况,那么你必须定义多个路由,每个路由绑定到一个特定的命名空间。

UPDATE

其实我想调用控制器其他程序集的动作,并取得该操作的视图HtmlString但处理。

哦。你的意思是你真的想在另一段代码中调用像一个方法的动作,而不是通过URL访问它?你可能使用类似WebClient的东西来实际发出请求并以字符串形式获取响应。这可能不是最有效的方式,但它可能是最简单的。

替代方案要复杂得多。如果这只是一个返回ViewResult的常规操作,那么这就是您实际上从调用它的方法返回的方法。但是,从快速调试会话看来,ViewResult直到它从操作返回并返回到流水线(不只是另一个操作)之后才会被处理。因此,您所得到的只是一个具有要使用的视图名称的对象以及应该用来呈现它的所有视图数据,即不是您可以做任何事情的实际呈现的字符串。但是,使用类似RazorEngine的内容,您可能可以手动从ViewResult中获取数据并对其执行任何操作。

+0

我的路线没有问题。我可以通过URL和我的路线在不同的程序集中调用任何控制器。但是我不能在我的'helper.Action()'中使用这些url。另外我有一个像你的例子一样的控制器。 –

+0

实际上我想在另一个程序集中的控制器中调用一个动作,并将该动作的视图作为HtmlString处理。 –