我在不同区域有 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。
因此,要在 ASP.NET Core 7 中使用
DynamicRouteValueTransformer
根据用户类型在两个控制器和操作之间切换,让我们逐步进行:
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;
}
}
UserModeTransformer
中配置Startup.cs
:在您的
Startup.cs
中,在UserModeTransformer
方法中配置ConfigureServices
:
public void ConfigureServices(IServiceCollection services)
{
// ...
services.AddControllersWithViews();
services.AddSingleton<DynamicRouteValueTransformer, UserModeTransformer>();
}
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>();
});
}
GetUserType
方法:在您的
UserModeTransformer
类中,实现 GetUserType
方法以根据应用程序的逻辑确定用户类型。
private UserType GetUserType()
{
// Implement logic to determine user type (e.g., roles, session data, etc.)
}
此方法应根据用户类型动态地将用户路由到适当的控制器和操作。
另请记住将
"Candidate"
和 "Agent"
替换为您的实际控制器名称。