我们有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核心中实现相似的功能?
作为解决方案的起点,您可以创建自定义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());
});
}