【问题标题】:POST Form Data to Blazor razor component (application/x-www-form-urlencoded)POST 表单数据到 Blazor razor 组件 (application/x-www-form-urlencoded)
【发布时间】:2021-06-30 14:36:13
【问题描述】:

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

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

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

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

【问题讨论】:

  • 可以是server端也可以是web assembly,请说清楚
  • @viveknuna 目的是有一个服务器端解决方案,但如果它更容易解决这个问题,则可以更改为 Web 程序集
  • 这不仅仅是解决这个问题。为什么我们使用 Web 程序集或服务器端有很大的不同。因此,我要求您首先研究哪一个满足您的要求,然后再继续进行。请不要难过,但请先做你的研究
  • @viveknuna 我认为这里似乎存在误解。我是 Blazor 的新手,但我对 Blazor 的概念和基于不同模型创建应用程序并不空白。这两种情况已经完成了不同的测试项目(POC)。问题是我不明白如何在 Blazor 中解决此类案例。请让我们专注于主要问题。这可能吗?如果是这样,将不胜感激如何进行的指导(当然不需要完整的解决方案)。在网络上找到与此相关的正确答案或参考资料非常困难。
  • 欢迎...拜托,请务必阅读:stackoverflow.com/help/someone-answers

标签: asp.net-core blazor blazor-server-side blazor-webassembly asp.net-blazor


【解决方案1】:

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

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

为此:

  1. 创建一个PostFormService,它在主机页面和您的组件之间传递帖子表单:
using Microsoft.AspNetCore.Http;

public class PostFormService
{
    public IFormCollection? Form { get; set; }
}
  1. PostFormService 注册到DI。在Startup.csConfigureServices方法中,添加:
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);
    }
}

【讨论】:

  • 你是圣人,这应该是公认的答案,效果很好。
【解决方案2】:

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

【讨论】:

  • 我测试了不同的方法并设法以不同的方式解决它,但我决定坚持使用您在上面描述的将 Blazor 与 MVC 结合起来的类似概念。对于无法控制的旧代码,这是一种可能的前进方式。
猜你喜欢
  • 2014-03-30
  • 1970-01-01
  • 2018-11-17
  • 1970-01-01
  • 1970-01-01
  • 2017-09-11
  • 2016-01-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多