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

时间:2015-10-05 16:30:49

标签: c# asp.net-mvc

我想在我的项目中使用方法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进行处理。

1 个答案:

答案 0 :(得分:0)

如果您确定每个组件中没有重复的控制器名称,例如Namespace1.FooControllerNamespace2.FooController,然后您只需添加应在namespaces参数的数组中搜索的所有名称空间。

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

<强>更新

  

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

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

替代方案要复杂得多。如果它只是一个返回ViewResult的常规操作,那么您实际上会像调用方法一样将其调用回来。但是,从快速调试会话开始,似乎ViewResult在从操作返回并返回管道(而不仅仅是其他操作)之后才会被处理。因此,您获得的只是一个对象,其中包含要使用的视图的名称以及应该用于渲染它的所有视图数据,即不是您可以执行任何操作的实际渲染字符串。但是,使用RazorEngine之类的内容,您可以手动从ViewResult获取数据并对其执行操作。