POST表单数据到Blazor剃须刀组件(application/x-www-Form-urlencoded)



我刚开始学习Blazor,所以如果问题很奇怪,请耐心等待。

是否可以将数据作为内容类型"POST";application/x-www-form-urlencoded";Blazor剃须刀组件,所以当在浏览器中打开页面时,它会显示调用方提供的初始值?当使用querystring并使用HTTPGET方法和navigationManager的帮助调用剃刀组件url时,它工作得很好。在这种情况下,我无法更改数据的发送方式。我需要能够处理具有内容类型application/x-www-form-urlencoded和提供初始值作为key=value的主体的HTTPPOST调用。加载页面时,数据应显示在屏幕上。然后,用户应该在页面上得到一些选项,并通过单击按钮进行选择。

如果这是不可能的,那么该特定要求的正确方法是什么,即不能改变数据的发送方式(必须是HTTP POST,内容类型为application/x-www-form-urlencoded(,接收应用程序为Blazor。

更新:Blazor应用程序最好是服务器端的,但如果需要,可以更改为web程序集(客户端(。

在Blazor Server中,应用内导航是通过websocket完成的,没有HTTP请求,因此没有GETPOST操作。您只能处理外部HTTP请求,这应该正是所讨论的情况。

Blazor组件,或者实际上Razor组件,尽管其中一些组件的行为类似于带有@page标签的页面,但它们只是组件。它们并不独立生活,但必须托管在Razor页面中,即默认情况下您的_Host.cshtml。对Blazor应用程序的任何外部HTTP请求实际上都是对托管页面的请求,托管页面根据请求URI加载相应的页面组件。这些请求在组件中看不到,但可以在托管页面中处理,因为它只是一个普通的旧Razor页面。

为此:

  1. 创建一个PostFormService,在主页面和组件之间传递post表单:
using Microsoft.AspNetCore.Http;
public class PostFormService
{
public IFormCollection? Form { get; set; }
}
  1. PostFormService注册到DI。在Startup.cs中的ConfigureServices方法中,添加:
services.AddScoped<PostFormService>();
  1. 将以下代码块添加到主机页:
@using Microsoft.AspNetCore.Mvc.RazorPages;
<!-- ignore anti-forgery token for external post requests -->
@attribute [IgnoreAntiforgeryToken]
<!-- specify model for the page -->
@model HostPageModel
@{
public class HostPageModel : PageModel
{
// postFormService is injected by the DI
public HostPageModel(PostFormService postFormService)
{
PostFormService = postFormService;
}
private PostFormService PostFormService { get; }
public void OnPost()
{
// store the post form in the PostFormService
PostFormService.Form = Request.Form;
}
}
}
  1. 现在您可以将PostFormService注入Razor组件并访问请求表单:
@inject PostFormService PostFormService;
@code{
protected override void OnInitialized()
{
base.OnInitialized();
// PostFormService.Form will be null if the page is not requested by 
// a POST method
var data = PostFormService.Form?["data"];
Console.WriteLine(data);
}
}

听起来你正在寻找一个MVC风格的解决方案,但它是在Blazor页面组件中实现的——我目前也是。使用EditForm或只是普通HTML提交操作的Blazor post请求是一个很容易找到指导的主题,但配备Blazor页面组件,使其能够像处理MVC控制器[HttpPost]装饰的方法一样处理传入的表单正文数据是一个挑战。然而,在某些情况下,比如当交易成功或失败时,外部卡支付门户会重定向到您的应用程序,这正是您所需要的。许多支付门户网站只配备了隐藏的输入字段,并像20年前一样形成主体键值元组,为消费者服务和发布!我感觉到你的痛苦。我怀疑我们需要MVC和Blazor功能的结合来实现这一点。

最新更新