代码之家  ›  专栏  ›  技术社区  ›  NSS

Blazor服务器:如何动态生成href

  •  1
  • NSS  · 技术社区  · 2 年前

    我正在使用Blazor服务器项目和.net 7。 我想在网格中渲染以下链接。 这里的需要是,只有当用户点击按钮时,我才想运行将用URL组成SAS令牌的代码,它应该打开这个动态生成的URL,它的SAS令牌有效期为1分钟。

     <a href="dynamically Generated when clicked on this link"  
          class="btn btn-primary ms-2 mt-1" target="_blank">View</a>
    

    根据答案(@sam和@Kurt Hamilton)的建议,这就是我想到的,但它通过重新分解当前页面来加载新的pgae,我希望页面加载在新的选项卡或新窗口中,看起来目标选项没有效果,因为我使用的是导航管理器并防止默认设置。

    <a href="#"
       @onclick:preventDefault="true"
       @onclick:stopPropagation="true"
       @onclick="@(async ()=> await ViewFile(fileInfo.FullFilePathAndName))"
       class="btn btn-primary ms-2 mt-1" target="_blank">View</a>
    
    3 回复  |  直到 2 年前
        1
  •  1
  •   Sam    2 年前

    我不确定这是否可能。但是,在您的情况下,最好在锚标记上使用onclick处理程序,并在该处理程序内使用NavigationManager转到动态生成的URL。在这种情况下,锚点标记的href应为href=“”,以确保单击链接时浏览器不会干扰NavigationManager。

    以下是一个示例:

    @page "/"
    
    @inject IJSRuntime JSRuntime
    
    <a href="" @onclick="OnClickHandler">View</a>
    
    @code {
        private async void OnClickHandler()
        {
            var token = "77465691";
            await JSRuntime.InvokeVoidAsync("open", $"https://stackoverflow.com/questions/{token}", "_blank");
        }
    }
    
        2
  •  1
  •   Kurt Hamilton    2 年前

    您可以将按钮与单击事件处理程序一起使用。

    1. 创建一个按钮 onclick 事件处理程序
    <button type="button" @onclick="@OnButtonClick">
    Click me to generate dynamic URL
    </button>
    
    1. 在事件处理程序中生成URL并使用 NavigationManager 进行导航。
    @inject NavigationManager NavigationManager
    @code {
      private void OnButtonClick()
      {
        string url = GenerateUrl();
        NavigationManager.NavigateTo(url);
      } 
    
      private string GenerateUrl()
      {
        // TODO: implement
        return "/";
      }  
    }
    

    编辑

    由于要求您使用正常的锚点功能(例如在新选项卡中打开),我建议您链接到充当中介的页面。中间页面将在初始化时生成链接,然后重定向到动态页面。

    1. 创建到中介页面的链接
    <a href="/my-link-generator" target="_blank">
    Link to dynamic URL
    </a>
    
    1. 创建中介页面
    @page "/my-link-generator"
    
    @inject NavigationManager NavigationManager
    @code {
      protected override void OnInitialized()
      {
        string url = GenerateUrl();
        NavigationManager.NavigateTo(url);
      }
      
      private string GenerateUrl()
      {
        // TODO: implement
        return "/";
      }
    }
    
        3
  •  0
  •   NSS    2 年前

    来自(Nb777)的帖子有帮助

    等待jsRuntime。InvokeAsync(“打开”,“”https://www.google.com/“”,“_blank”);