.. net核心替换为MvcCodeRouting。基于命名空间的路由

问题描述 投票:2回答:1

我们有ASP.NET MVC 5项目,我们计划将其迁移到ASP.NET Core3。目前,我在新的新平台上收集了依赖项列表及其等效替换。

我们正在使用MvcCodeRouting包来分隔不同C#名称空间之间的不同工作流,如https://maxtoroq.github.io/2013/02/aspnet-mvc-workflow-per-controller.html中所述。

现在有了新平台,我们需要类似的东西。作为最后的选择,我们只能在路由表中指定所有名称空间,但我不想这样做。关于如何完成类似行为的任何建议?

编辑:我认为以示例为例,我想完成的工作会更容易理解。

我们具有以下控制器结构:

- Namespace1
-- Workflow1Controller.Index/Edit/Action
-- Workflow2Controller.Index/Edit/Action
-- Workflow3Controller.Index/Edit/Action
- Namespace2
-- Workflow4Controller.Index/Edit/Action

Workflow1Controller代码:

namespace RootProjectNamespace.Controllers.Namespace1
{
    class Workflow1Controller : Controller
    {
         public ActionResult Index() {}
         // and so on
    }
}

以类似方式放置适当的视图。

并且使用MvcCodeRouting,我们可以通过以下方式创建Action网址:

Url.Action("Namespace1.Workflow1Controller", "Index") // Creates -> ~/Namespace1/Workflow1Controller/Index
Url.Action("Namespace2.Workflow4Controller", "Action") // Creates -> ~/Namespace2/Workflow4Controller/Index

在路由表中没有显式的硬编码路由的情况下,是否有可能在.net核心中实现相似的功能?

c# asp.net-mvc asp.net-core asp.net-mvc-routing
1个回答
0
投票

作为解决方案的起点,您可以创建自定义IApplicationModelConvention并更改路由以在路由中使用名称空间。

文档中有一个示例显示了如何执行此操作。要了解更多信息,您可以看一下这篇出色的文档文章:IApplicationModelConvention

为此,首先创建以下Work with the application model in ASP.NET Core类:

NamespaceRoutingConvention

然后在启动时,像这样注册约定:

using Microsoft.AspNetCore.Mvc.ApplicationModels;
using System.Linq;

public class NamespaceRoutingConvention : IApplicationModelConvention
{
    public void Apply(ApplicationModel application)
    {
        foreach (var controller in application.Controllers)
        {
            var hasAttributeRouteModels = controller.Selectors
                .Any(selector => selector.AttributeRouteModel != null);

            if (!hasAttributeRouteModels)
            {
                controller.Selectors[0].AttributeRouteModel = new AttributeRouteModel()
                {
                    Template = controller.ControllerType.Namespace.Replace('.', '/') 
                        + "/[controller]/[action]/{id?}"
                };
            }
        }
    }
}

然后您可以浏览:

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc(options => {
        options.Conventions.Add(new NamespaceRoutingConvention());
    });
}
© www.soinside.com 2019 - 2024. All rights reserved.