【问题标题】:How to call a controller that is in another assembly when using Html.Action()?使用 Html.Action() 时如何调用另一个程序集中的控制器?
【发布时间】:2015-10-05 16:30:49
【问题描述】:

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

我的路线没有问题。此外,我可以通过 URL/路由调用不同程序集中的任何控制器。
但我不能在我的HtmlHelper.Action() 中使用这些网址。
实际上,我想在另一个程序集中的控制器中调用一个动作,并将该动作的视图作为 HtmlString 但已处理。

【问题讨论】:

  • 如果你不明白我的描述,请写评论。

标签: c# asp.net-mvc


【解决方案1】:

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

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

更新

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

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

替代方案要复杂得多。如果它只是一个返回ViewResult 的常规操作,那么这就是您实际上可以从像方法一样调用它中得到的结果。但是,从快速调试会话来看,ViewResult 似乎直到它从操作返回并返回管道(不仅仅是另一个操作)之后才被处理。结果,您得到的只是一个对象,其中包含要使用的视图的名称以及应该用来渲染它的所有视图数据,即不是您可以做任何事情的实际渲染字符串。但是,使用RazorEngine 之类的东西,您也许可以手动从ViewResult 中获取数据并对其进行处理。

【讨论】:

  • 我的路线没有问题。我可以通过 URL 和我的路由调用不同程序集中的任何控制器。但我不能在我的helper.Action() 中使用这些网址。另外我有一个像你的例子一样的重复控制器。
  • 实际上我想在另一个程序集中的控制器中调用一个动作,并将该动作的视图作为 HtmlString 但已处理。
猜你喜欢
  • 2020-02-28
  • 1970-01-01
  • 2016-01-01
  • 1970-01-01
  • 2018-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-05
相关资源
最近更新 更多