我正在使用asp.net mvc做一些插件工作。 我有两个插件(mvc项目)说用户和家。在这两个插件中,我都有家庭控制器。是的,插件(项目)中的名称是家庭控制器。当我构建项目时,Dll被复制到主机项目(第三个)。
这是家庭插件
namespace Plugin.Home.Controllers
{
public class HomeController : Controller
{
public string Index()
{
return "Home from home";
}
public string JustATest()
{
return "Just a test from home";
}
}
}
这是另一个项目中的另一个控制器(用户插件)
这是家庭控制器
namespace Plugin.Users.Controllers
{
public class HomeController : Controller
{
public string Index()
{
return "Home from Users";
}
public string JustATest()
{
return "Just a test from Users";
}
public string JustAnotherTest()
{
return "Just another test from Users";
}
}
}
在global.asax中,我使用命名空间注册路由。
routes.MapRoute(
"Default", // Route name
"Home/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = UrlParameter.Optional },
new[] { "Plugin.Home.Controllers" }
routes.MapRoute(
"Users", // Route name
"users/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = UrlParameter.Optional }, new[] { "Plugin.Users.Controllers" }
);
我可以毫无问题地访问浏览器中的所有路径。
现在问题
我尝试使用@ {Html.RenderAction(“JustATest”,“Home”);} 它仅从家庭模块中的家庭控制器呈现。如何从用户模块中呈现它。
它会抛出异常,说家庭控制器中找不到方法, 当我说@ {Html.RenderAction(“JustAnotherTest”,“Home”);}
在什么阶段我可以检查给定的控制器是否具有给定的方法(某些ControllerFactory)。或者我怎样才能确保它拿起合适的控制器。
帮助将不胜感激。
此致
成员Parminder
答案 0 :(得分:2)
如果你真的需要保存控制器名称HomeController,我看到这样使用hack的简单解决方案:
routes.MapRoute(
null,
"{home}/{action}/{id}",
new { controller = "Home", action = "Index", home="Home", id = UrlParameter.Optional });
routes.MapRoute(
null,
"{home}/{action}/{id}",
new { controller = "Home", action = "Index", home="Users", id = UrlParameter.Optional }
);
您可以通过url和RenderAction访问此操作:
@{Html.RenderAction("JustATest","Home", new {home="Home"});}
@{Html.RenderAction("JustATest","Home", new home="Users");}
但我认为这个问题是假的(因为你想象的更难),而你只使用手段来使用手段,而不是解决实际问题。对于真正的插件架构,您至少需要创建: 1.自定义路径约束用于检查,控制器类型来自装配,其中控制器已定义。 2.安装程序,将独立于主应用程序安装所有路由 3.为每个插件应用程序创建单元测试路由,以确保从插件安装的所有路由都不能彼此了解(并且不会相互破坏)。
我建议您将控制器放在主Web应用程序中,并为它们指定不同的名称。
答案 1 :(得分:0)
请参阅此处使用的格式:
@Html.RenderACtion<Plugin.Home.Controllers.HomeController>(...)
修改强>
我现在看到你的问题。它们是在运行时动态加载的,因此在编译时不知道名称。使用DefaultControllerFactory查看,如各种帖子中所述:
How to achieve a dynamic controller and action method in ASP.NET MVC?