在动作之间共享路由参数



我有以下两条路由

[Route("{tenant}/Index")]
public IActionResult Index()
{
return View();
}
[Route("{tenant}/About")]
public IActionResult About()
{
return View();
}

我想用这个链接从一个视图到另一个视图:

<a asp-action="Index" asp-route-tenant="bouke">Index</a>
<a asp-action="About" asp-route-tenant="bouke">Index</a>

这将呈现预期的输出:

<a href="/bouke/Index">Index</a>
<a href="/bouke/About">Index</a>

但是我不想在每个链接上传递asp-route-tenant。类似于asp-controller,如果未指定则取当前控制器。但是下面的代码不能正常工作:

<a asp-action="Index">Index</a>
<a asp-action="About">Index</a>

当从About页面呈现时,它将呈现为:

<a href="">Index</a>
<a href="/bouke/About">Index</a>

有两个问题:

  • 如何避免在所有链接上定义租户路由参数?
  • 有没有办法让Asp。Net抛出一个异常,如果它不能找到一个适当的路由,而不是无声地失败,并产生非工作链接?

您必须添加自定义装饰器,自动将tenant应用到链接

这是来自Finbuckle的示例代码。多租户:

AmbientValueLinkGenerator.cs

和更新你的启动类如下:

Startup.cs

如果我需要处理租户不在链接中或无效的情况,我创建了一个自定义IPageFilter,它会将用户重定向到默认页面,在我的情况下,租户应该被选中

public class TenantRouteFilter : IPageFilter
{
private readonly string _pathToTenantSelection;
public TenantRouteFilter(string pathToTenantSelection)
{
_pathToTenantSelection = pathToTenantSelection;
}
public void OnPageHandlerSelected(PageHandlerSelectedContext context)
{
}
public void OnPageHandlerExecuting(PageHandlerExecutingContext context)
{
//Check if user is authenticated and that we are not on page we are trying to redirect to
if (context.HttpContext.User.Identity.IsAuthenticated &&
!context.ActionDescriptor.DisplayName.Contains(_pathToTenantSelection, StringComparison.OrdinalIgnoreCase))
{
var name = context.HttpContext.GetTenant();
if (string.IsNullOrEmpty(name))
{
context.Result = new RedirectResult($"/default{_pathToTenantSelection}");
}
}
}
public void OnPageHandlerExecuted(PageHandlerExecutedContext context)
{
}
}

和Startup.cs

services.AddRazorPages()
.AddRazorPagesOptions(options =>
{
options.Conventions.ConfigureFilter(new TenantRouteFilter("/TenantSelection"));
});

最新更新