c# - MVC 排除 Controller 使用

标签 c# asp.net-mvc inheritance routes overriding

我创建了一个"template"项目 A,它有 10 个 Controller (部分类)。 所有这些 Controller 都打包在一个 nuget 包中,并由项目 B、C 和 D 使用。nuget 在文件夹 controllers/_core 中生成 Controller ,因此它们很好地分开存储。 nuget 包没有对项目 A 的 dll 的引用。

现在开始解决问题; 可能是生成的 Controller 之一需要修改。通过添加第二个部分,我们可以添加一些逻辑,但我们可能需要重写现有方法以在方法内添加逻辑。因为这个(也因为我在下面添加的原因)我正在考虑从这些基本 Controller 继承。当我们继承一个基本 Controller 时,它应该被 MVC 排除。

示例:Image PersonController 是使用 nuget 包在 controllers/_core 文件夹中创建的,每个方法都是虚拟的。 然后,我们将在继承自 PersonController 的 Controller 文件夹中创建一个 _PersonController,为了简单起见,仅重写了 index 方法。此时我们想要更改路由,使 localhost/Person/index 最终出现在 _PersonController 的 index 方法中,而不是 PersonController 的索引方法。 PersonController 应该被完全忽略。

每次我们需要覆盖时添加自定义路由是我唯一的选择吗?或者是否有针对此类问题的更好解决方案(自定义 MVC Controller 工厂?)? + 如何定义此类路由?

我考虑继承的额外原因: 每次我们更新 nuget 包时,它都会尝试覆盖对消费者项目 B、C 和 D 中生成的 Controller 所做的所有更改。

亲切的问候,

亚尼克

最佳答案

您可以使用 Controller 继承。

ASP.NET 核心

要忽略不需要的 Controller ,您需要实现 IApplicationFeatureProvider<ControllerFeature>或来自 ControllerFeatureProvider :

public class MyControllerFeatureProvider : ControllerFeatureProvider
{
    protected override bool IsController(TypeInfo typeInfo)
    {
        var isController = base.IsController(typeInfo);
        if (isController)
        {
            //overriding isController value
        }
        return isController;
    }
}

然后在您的 Starup.ConfigureServices您需要替换默认的 ControllerFeatureProvider :

services.AddMvc()
.ConfigureApplicationPartManager(manager =>
{
    var controllerFeatureProvider =
        manager.FeatureProviders
            .Single(p => p.GetType() == typeof(Microsoft.AspNetCore.Mvc.Controllers.ControllerFeatureProvider));
    manager.FeatureProviders[manager.FeatureProviders.IndexOf(controllerFeatureProvider)] =
       new Attributes.MyControllerFeatureProvider();
});

ASP.NET MVC 5 及更早版本

在您的特定情况下,您可以在路由注册和设置中使用 namespace 列表 UseNamespaceFallbackfalse忽略其他 namespace :

var myRoute  = routes.MapRoute(
        name: "Default",
        url: "{controller}/{action}/{id}",
        defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },
        namespaces: new [] {"Namespace1", "Namespace2"}
    );

myRoute.DataTokens["UseNamespaceFallback"] = false;

关于c# - MVC 排除 Controller 使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48783934/

相关文章:

C++继承与构造函数、析构函数

c++ - 是否可以创建一个链表来保存指针而不是整数或字符串?

c# - 将实例映射到 Ninject 绑定(bind)中的对象

c#:使用程序集(通过反射)作为(元)数据存储

jquery - 是否有 JQuery 时间插件可用于在 ASP.NET MVC 页面上选择时间?

asp.net-mvc - 有没有办法在 asp mvc 应用程序中重用编辑器和显示模板?

c++ - Qt信号槽重复代码避免

c# - 在 C# 中不使用 Invoke 访问控件

c# - 我可以触发 5 分钟后启动的 Azure 函数吗

asp.net-mvc - 使用 ServiceStack 设计 Web 应用程序