我正在开发一个.NET核心MVC应用程序,它要求允许使用其他控制器/操作名称。为此,我在MapRoute上使用自己的路由器:
app.UseMvc(routes =>
{
routes.Routes.Add(new CustomRouter(routes.DefaultHandler));
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
我的自定义路由器观察请求的控制器和操作,并基于它将一个新值放入请求中的routeddata中:
public async Task RouteAsync(RouteContext context)
{
[...]
if (requestedAction == "fakeAction")
context.RouteData.Values["action"] = "realAction";
但是,要确定
requestedAction
,我基本上是采用请求的路径,将其拆分并以这种方式获取其值。这似乎不太理想。
var rr = new RouteBuilder(app);
var myRoute = rr.MapRoute(...).Build();
var myRouteData = myRoute.GetRouteData(context);
myRouteData["action"] == "fakeAction";
我非常喜欢的另一个解决方案是,如果我能做到以下几点:
app.UseMvc(routes =>
{
routes.MapRoute(
name: "something",
template: "{controller=Home}/{action=Index}/{id?}");
routes.Routes.Add(new CustomRouter(routes.DefaultHandler));
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
something
route实际上路由任何东西,并且只作为为我的CustomRouter定义RouteData的一种方式。
这两个都可能吗?我不喜欢我们不干净地实现现有功能的想法,因为这既是一种代码味道,也是未来潜在的维护困难。