我想在我的项目中使用方法Html.Action()。 我有两个项目。
项目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进行处理。
答案 0 :(得分:0)
如果您确定每个组件中没有重复的控制器名称,例如Namespace1.FooController
和Namespace2.FooController
,然后您只需添加应在namespaces
参数的数组中搜索的所有名称空间。
但是,如果您确实有重复的名称,那么该路由将最终匹配多个控制器,这是一个问题。尽管命名空间的顺序,但namespaces
参数的操作顺序都没有 - 所有都被搜索并且所有操作都被平等对待。如果是这种情况,那么您必须定义多个路由,每个路由都绑定到特定的命名空间。
<强>更新强>
实际上我想在另一个程序集中的控制器中调用一个动作,并将该动作的视图作为HtmlString进行处理。
喔。你的意思是你真的想在另一段代码中调用动作就像一个方法,而不是通过URL获取它?您可以使用类似WebClient
的内容来实际发出请求并以字符串形式获取响应。不可否认,这可能不是最有效的方式,但它可能是最简单的方法。
替代方案要复杂得多。如果它只是一个返回ViewResult
的常规操作,那么您实际上会像调用方法一样将其调用回来。但是,从快速调试会话开始,似乎ViewResult
在从操作返回并返回管道(而不仅仅是其他操作)之后才会被处理。因此,您获得的只是一个对象,其中包含要使用的视图的名称以及应该用于渲染它的所有视图数据,即不是您可以执行任何操作的实际渲染字符串。但是,使用RazorEngine之类的内容,您可以手动从ViewResult
获取数据并对其执行操作。