【问题标题】:Controller inheritance and choosing which controller has prevalence控制器继承和选择哪个控制器流行
【发布时间】:2019-01-10 09:29:52
【问题描述】:

我有一个基础项目和不同的继承项目。基础项目有一些控制器,我可能希望偶尔继承和覆盖(部分)。

基础项目:

public virtual ActionResult Index(string filter = "", int page = 1)

子项目:

public override ActionResult Index(string filter = "", int page = 1)

现在我更改了 routeConfig,因此路由从正确的命名空间映射到逻辑。

context.MapRoute(
                "Routename",
                "AreaName/{controller}/{action}/{id}",
                new { controller = "ControllerName", action = "Index", id = UrlParameter.Optional },
                new string[] { "ProjectName.Areas.AreaName.SpecificControllers"}
            );

但是,我希望从特定项目中获取新添加的路线,如果它们存在的话。那些不存在的应该取自基础项目的控制器。 (特定的控制器基本上一开始是空的,并且只包含需要覆盖的方法)。为了尝试实现此功能,我将另一个项目添加到此处的路由中:

 context.MapRoute(
                "Routename",
                "AreaName/{controller}/{action}/{id}",
                new { controller = "ControllerName", action = "Index", id = UrlParameter.Optional },
                new string[] { "ProjectName.Areas.AreaName.SpecificControllers", "ProjectName.Areas.AreaName.GenericControllers"}
            );

但是,这显然会导致如下错误:

Multiple types were found that match the controller named 'MethodName'. This can happen if the route that services this request ('CRM/{controller}/{action}/{id}') does not specify namespaces to search for a controller that matches the request. If this is the case, register this route by calling an overload of the 'MapRoute' method that takes a 'namespaces' parameter.

The request for 'MethodName' has found the following matching controllers:
ProjectName.Areas.AreaName.SpecificControllers.ControllerName
ProjectName.Areas.AreaName.GenericControllers.ControllerName

有没有办法实现这一点,这样我的路由将始终首先查看特定控制器,并且如果在特定控制器中找不到方法,则仅查看通用控制器?

【问题讨论】:

    标签: c# asp.net-mvc inheritance


    【解决方案1】:

    据我所知,一般路由选择基本控制器方法。

    没有直接支持来解决您在此问题中提到的问题。

    有几种解决方法可以解决此问题。

    选项 1(我最喜欢的): Admin 在基础上,Route 在继承的控制器上。

    在基本控制器上使用[Area],在继承控制器上使用[Route]。

    我个人喜欢这种方法,因为它使控制器内部的代码保持干净。

    [Area("Admin")]
    AdminBaseController: Controller { }
    
    [Route("Users"))
    UserAdminController : AdminBaseController { }
    
    • 网址将是 /Admin/Users/Action

    选项 2: 在派生控制器操作中使用特定路由前缀 [路线(“管理员”)] AdminBaseController:控制器{}

    public static string UserAdminControllerPrefix = "/Users";
    UserAdminController : AdminBaseController { 
    
    [Route(UserAdminControllerPrefix + "/ActionName")]
    public void ActionName() {  }
    
    }
    
    • 形成的 URL 将是 /Admin/Users/ActionName

    您可以选择适合您风格的任何选项。 希望这可以帮助。 此答案中提到的两种方法:ASP.NET Core MVC Attribute Routing Inheritance

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-03-01
      • 2013-08-06
      • 2015-07-14
      • 2016-05-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多