小编Tho*_*son的帖子

覆盖/扩展MVC控制器/区域

我正在研究一个MVC项目,我正在试图弄清楚如何扩展区域内现有Controller的路由,特别是从另一个项目.

例如,我有一个控制器,其区域如下所示:

namespace MyProject.Areas.Foo.Controllers
{
    [Authorize]
    public class FooController : ApplicationController
    {
          //code
    }
}
Run Code Online (Sandbox Code Playgroud)

而我想做的是,能够在一个单独的项目中定义另一个Controller,可以像这样扩展它:

namespace MyOtherProject.Areas.Foo.Custom.Controllers
{
    public class FooController : ApplicationController
    {
          public string Bar()
          {
               return "Bar";
          }
    }
}
Run Code Online (Sandbox Code Playgroud)

基本上,我希望控制器几乎像我使用partial关键字一样运行(这样我就可以调用原始或新的操作中的任何操作).

主要问题

我真正想要实现的是,我有一个主要项目,包括几个区域和我的解决方案的另一个区域,包含各种客户端文件夹.我希望能够为我的主项目扩展基本控制器,并在这些客户端文件夹中添加特定于客户端的操作,以便它们可以在主项目中使用.我已经使用某些MVC视图执行此操作,但我希望我也可以使用控制器完成它.

我试过的

  • 我尝试partial在类的两个声明中使用关键字,但由于它们在不同的项目/程序集中,我认为这不起作用.
  • 我定义了一个构建事件,它将自定义DLL移动到bin主MVC项目的目录中,但似乎没有按预期工作.
  • 我已经尝试了各种继承方法,希望新类可以被拾取,但那些不起作用(收到重复的控制器声明错误).
  • 我读过关于尝试使用自定义ControllerFactory但我不确定如何实现它.
  • 我已经尝试在AreaRegistration部分中定义自定义命名空间路由参数来获取新控制器,如下例所示.

路由示例(AreaRegistration)

context.MapRoute(
    AreaName,
    String.Format("{0}/{{action}}/{{id}}", AreaName),
    new { controller = AreaName, action = "Index", id = UrlParameter.Optional },
    new[] { 
        String.Format("MyProject.Areas.{0}.Controllers", AreaName),
        String.Format("MyOtherProject.Areas.{0}.Custom.Controllers", AreaName)
    }
);
Run Code Online (Sandbox Code Playgroud)

更新

我尝试了一种在这里看到的方法,根据一些评论讨论,只需通过继承处理这个: …

c# asp.net asp.net-mvc

8
推荐指数
1
解决办法
3447
查看次数

标签 统计

asp.net ×1

asp.net-mvc ×1

c# ×1