多控制器中的Asp.net MVC RenderAction方法

时间:2011-08-26 02:34:36

标签: asp.net asp.net-mvc asp.net-mvc-3 asp.net-mvc-routing asp.net-mvc-areas

我正在使用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" }
       );

我可以毫无问题地访问浏览器中的所有路径。

现在问题

  1. 我尝试使用@ {Html.RenderAction(“JustATest”,“Home”);} 它仅从家庭模块中的家庭控制器呈现。如何从用户模块中呈现它。

  2. 它会抛出异常,说家庭控制器中找不到方法, 当我说@ {Html.RenderAction(“JustAnotherTest”,“Home”);}

  3. 在什么阶段我可以检查给定的控制器是否具有给定的方法(某些ControllerFactory)。或者我怎样才能确保它拿起合适的控制器。

    帮助将不胜感激。

    此致

    成员Parminder

2 个答案:

答案 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)

请参阅此处使用的格式:

render action with lambda

@Html.RenderACtion<Plugin.Home.Controllers.HomeController>(...)

修改

我现在看到你的问题。它们是在运行时动态加载的,因此在编译时不知道名称。使用DefaultControllerFactory查看,如各种帖子中所述:

How to achieve a dynamic controller and action method in ASP.NET MVC?