将表单数据发布到 Blazor razor 组件 (application/x-www-form-urlencoded)

问题描述 投票:0回答:3

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

是否可以将数据作为内容类型“application/x-www-form-urlencoded”发布到 Blazor razor 组件,以便在浏览器中打开页面时,它将显示调用者提供的初始值?当使用查询字符串并使用 HTTP GET 方法并在 navigationManager 的帮助下调用 razor 组件 url 时,它效果很好。在这种情况下,我无法更改数据的发送方式。我需要能够使用内容类型 application/x-www-form-urlencoded 处理 HTTP POST 调用,并且主体提供初始值作为 key=value。加载页面时,数据应显示在屏幕上。然后应该在页面上为用户提供一些选项,并通过单击按钮进行选择。

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

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

asp.net-core blazor blazor-server-side blazor-webassembly asp.net-blazor
3个回答
6
投票

在 Blazor Server 中,应用内导航是通过 websocket 完成的,没有发出 HTTP 请求,因此没有

GET
POST
操作。您只能处理外部 HTTP 请求,这应该正是所讨论的情况。

Blazor 组件,或者实际上是 Razor 组件,尽管其中一些组件的行为类似于带有

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

要执行此操作:

  1. 创建一个
    PostFormService
    ,在主机页面和组件之间传递帖子表单:
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);
    }
}

1
投票

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


0
投票

另一种选择是发布表单,将响应存储在全局 DI 对象中,然后根据响应,您可以导航到另一个页面并从 DI 对象加载它。

© www.soinside.com 2019 - 2024. All rights reserved.