You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Blazor WebAssembly托管项目:Server控制器重定向传参至Client页面

问题描述

我创建了一个Blazor WebAssembly ASP.NET Core托管解决方案,包含BlazorApp1.Client、BlazorApp1.Server和BlazorApp1.Shared三个项目。在BlazorApp1.Server中,我有一个带有HttpPost方法MyPost的控制器,该方法通过表单接收数据,代码如下:

[HttpPost]
[Route("/Register")]
[Consumes("application/x-www-form-urlencoded")]
public ActionResult MyPost([FromForm] string data)
{
    return Ok(data);
}

现需重定向到BlazorApp1.Client中的Index页面(地址为http://localhost:48518/Index),并传递MyPost方法接收的数据,请问该如何实现?

解决方案

以下是几种实用的实现方式,可根据数据敏感度、大小选择:

方法1:查询字符串传递(适合非敏感短数据)

直接在重定向URL后拼接编码后的参数,客户端页面读取URL参数即可:

服务器端修改控制器方法

[HttpPost]
[Route("/Register")]
[Consumes("application/x-www-form-urlencoded")]
public ActionResult MyPost([FromForm] string data)
{
    // 对数据做URL编码,避免特殊字符破坏URL结构
    var encodedData = Uri.EscapeDataString(data);
    return Redirect($"http://localhost:48518/Index?data={encodedData}");
}

客户端Index.razor读取参数

@page "/Index"
@inject NavigationManager NavManager

<h3>接收的数据:@ReceivedData</h3>

@code {
    private string? ReceivedData { get; set; }

    protected override void OnInitialized()
    {
        var uri = new Uri(NavManager.Uri);
        var dataParam = System.Web.HttpUtility.ParseQueryString(uri.Query).Get("data");
        if (!string.IsNullOrEmpty(dataParam))
        {
            ReceivedData = Uri.UnescapeDataString(dataParam);
        }
    }
}

方法2:Session暂存(适合敏感/大数据)

用服务器Session临时存储数据,客户端通过API获取,避免数据暴露在URL中:

1. 服务器启用Session

在Program.cs中添加Session服务:

builder.Services.AddSession(options =>
{
    options.IdleTimeout = TimeSpan.FromMinutes(5); // 设置数据过期时间
    options.Cookie.HttpOnly = true;
    options.Cookie.IsEssential = true;
});

并在中间件链中启用:

app.UseSession();

2. 修改控制器Post方法

[HttpPost]
[Route("/Register")]
[Consumes("application/x-www-form-urlencoded")]
public ActionResult MyPost([FromForm] string data)
{
    // 将数据存入Session
    HttpContext.Session.SetString("PostedData", data);
    return Redirect("http://localhost:48518/Index");
}

3. 服务器新增获取数据的API

[HttpGet]
[Route("/GetPostedData")]
public IActionResult GetPostedData()
{
    var data = HttpContext.Session.GetString("PostedData");
    if (data == null)
    {
        return NotFound();
    }
    // 取出后删除Session,防止重复获取
    HttpContext.Session.Remove("PostedData");
    return Ok(data);
}

4. 客户端Index.razor调用API

@page "/Index"
@inject HttpClient Http

<h3>接收的数据:@ReceivedData</h3>

@code {
    private string? ReceivedData { get; set; }

    protected override async Task OnInitializedAsync()
    {
        try
        {
            ReceivedData = await Http.GetStringAsync("/GetPostedData");
        }
        catch (HttpRequestException)
        {
            // 处理数据过期或不存在的情况
            ReceivedData = "无有效数据";
        }
    }
}

方法3:路由参数传递(适合结构化短数据)

将数据作为路由的一部分传递,适合固定格式的短内容:

服务器端重定向

[HttpPost]
[Route("/Register")]
[Consumes("application/x-www-form-urlencoded")]
public ActionResult MyPost([FromForm] string data)
{
    var encodedData = Uri.EscapeDataString(data);
    return Redirect($"http://localhost:48518/Index/{encodedData}");
}

客户端Index.razor配置路由并接收参数

@page "/Index/{data?}"

<h3>接收的数据:@Data</h3>

@code {
    [Parameter]
    public string? Data { get; set; }

    protected override void OnInitialized()
    {
        if (Data != null)
        {
            Data = Uri.UnescapeDataString(Data);
        }
    }
}

内容的提问来源于stack exchange,提问作者user21980057

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 11:42:25