如何使用DynamicRouteValueTransformer在2个控制器和动作之间切换

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

我在不同区域有 2 个类似的控制器,我尝试根据用户类型进行路由。例如,两个控制器都有应该显示主页的索引操作;

WebApp.Areas.Candidate.Controllers.SocialController.Index
WebApp.Areas.Agent.Controllers.SocialController.Index

目前,当我将

HttpGet("")
属性添加到两个操作时,我遇到了异常;
AmbiguousMatchException: The request matched multiple endpoints. Matches:

因此,我删除了该属性并创建了一个

DynamicRouteValueTransformer
来尝试动态更改“/”端点应使用的控制器和操作,但转换器未使用我的更改。变压器看起来像这样;

public class UserModeTransformer : DynamicRouteValueTransformer
{
    public readonly ApplicationDbContext _context;

    public UserModeTransformer(ApplicationDbContext context)
    {
        _context = context;
    }

    public override async ValueTask<RouteValueDictionary> TransformAsync(HttpContext httpContext, RouteValueDictionary values)
    {
        values = new RouteValueDictionary();
        values["controller"] = "SocialController";
        values["action"] = "Index";
        return values;
    }
    public override async ValueTask<IReadOnlyList<Endpoint>> FilterAsync(HttpContext httpContext, RouteValueDictionary values, IReadOnlyList<Endpoint> endpoints)
    {
        return endpoints;
    }
}

现在我只是设置

RouteValueDictionary values
看看它是否有效,但无论我将其更改为
DynamicRouteValueTransformer
哪个控制器都不起作用。

我尝试查找有关 DynamicRouteValueTransformer 的文档,但找不到任何文档。我正在使用 ASP.NET Core 7。

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

因此,要在 ASP.NET Core 7 中使用

DynamicRouteValueTransformer
根据用户类型在两个控制器和操作之间切换,让我们逐步进行:

  1. 实现
    UserModeTransformer
    类:

定义扩展

UserModeTransformer
DynamicRouteValueTransformer
类。该类将根据用户类型动态设置控制器和操作:

public class UserModeTransformer : DynamicRouteValueTransformer
{
    public override async ValueTask<RouteValueDictionary> TransformAsync(HttpContext httpContext, RouteValueDictionary values)
    {
        var userType = GetUserType(); // Implement logic to determine user type

        if (userType == UserType.Candidate)
        {
            values["controller"] = "Candidate";
        }
        else if (userType == UserType.Agent)
        {
            values["controller"] = "Agent";
        }
        else
        {
            values["controller"] = "Home"; // Default controller for other users
        }

        values["action"] = "Index"; // Common action for all

        return values;
    }
}
  1. UserModeTransformer
    中配置
    Startup.cs

在您的

Startup.cs
中,在
UserModeTransformer
方法中配置
ConfigureServices

public void ConfigureServices(IServiceCollection services)
{
    // ...
    services.AddControllersWithViews();

    services.AddSingleton<DynamicRouteValueTransformer, UserModeTransformer>();
}
  1. Startup.cs
    中设置路由:

使用

MapControllerRoute
Configure
方法中的
Startup.cs
配置路由:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    // ...

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapControllerRoute(
            name: "default",
            pattern: "{controller=Home}/{action=Index}/{id?}")
            .AddDynamicTransform<UserModeTransformer>();
    });
}
  1. 实现
    GetUserType
    方法:

在您的

UserModeTransformer
类中,实现
GetUserType
方法以根据应用程序的逻辑确定用户类型。

private UserType GetUserType()
{
    // Implement logic to determine user type (e.g., roles, session data, etc.)
}

此方法应根据用户类型动态地将用户路由到适当的控制器和操作。

另请记住将

"Candidate"
"Agent"
替换为您的实际控制器名称。

© www.soinside.com 2019 - 2024. All rights reserved.