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
相关产品推荐
相关产品推荐

