【问题标题】:Send the results of an API POST request in one component to another component for use?将一个组件中的 API POST 请求的结果发送到另一个组件以供使用?
【发布时间】:2021-03-08 17:11:32
【问题描述】:

我已按照教程 HERE 向 API 发出 POST 请求,并且效果很好;我已成功请求 -> 收到 -> 并处理了数据。

我现在正在尝试扩展我学到的知识并将其用于我更大的应用程序中,但我不知道该怎么做。

我使用Index.razor 页面作为我的“根”页面。在这个根页面中,我有一些逻辑来决定在页面上显示什么。如果没有要处理的结果,我会显示搜索输入表单 (DefaultSearch.razor)。如果有要处理的结果,我会显示这些结果 (SearchResultsPage.razor)。

我的问题是我不知道如何(1)将输入的查询字符串从DefaultSearch.razor组件发送回根页面进行处理,(2) strong> 如何将返回的处理结果发送到SearchResultsPage.razor 组件进行显示。

Index.razor:

@page "/"
<div class="text-center">
    <HeaderLarge />
        @if (fetchedResults == null)
        {
            <DefaultSearch />
        } else {
            <SearchResultsPage />
        }
</div>

@code {
    try
    {
        HttpClient client = new HttpClient();
        client.BaseAddress = new Uri(@"http://192.168.1.234:8080");
        Search search = new Search(queryString);
        string searchstr = JsonConvert.SerializeObject(search);
        StringContent content = new StringContent(searchstr, Encoding.UTF8, "application/json");
        using HttpResponseMessage httpResponse = await client.PostAsync(("/api/...", content);
        httpResponse.EnsureSuccessStatusCode();
        if (httpResponse.StatusCode == System.Net.HttpStatusCode.OK)
        {
            string response = await httpResponse.Content.ReadAsStringAsync();
            fetchedResults = JsonConvert.DeserializeObject<SearchResultSet>(response);
        }
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.Message);
    }
}

DefaultSearch.razor:

<div id="SearchContainer">
    <div id="SearchFormContainer">
        <input id="mainSearchInputField" name="queryString" type="text" /><button @onclick()>Search</button>
    </div>
</div>

@code {

}

SearchResultsPage.razor:

@page "/search"
<h3>SearchResultsPage</h3>
<div>
    @if (fetchedResults != null)
    {
        @foreach (var result in fetchedResults.documents)
        {
            <div>
                <table class="message">
                    <tr>
                        <td>Subject</td>
                        <td>@(result.subject)</td>
                    </tr>
                    <tr>
                        <td>ID</td>
                        <td>@result.docId</td>
                    </tr>
                    <tr>
                        <td class="message_body" colspan="2">
                            <span>@(result.messageBody)</span>
                        </td>
                    </tr>
                </table>
            </div>
        }
    }
</div>

@code {
    [Parameter]
    public SearchResultSet fetchedResults { get; set; }
}

【问题讨论】:

  • Index.razor 只是您想要的一个例子吗?这不是一个有效的剃须刀组件@code 块。
  • @ConnorLow 是的,但它应该是有效的。我从我的工作测试程序中复制了我的代码。如果这一切都不存在,那么我一定是忘记了什么。我成功地从 API 取回数据,所以这不是我需要帮助的。但是,总的来说,这就是我想要的。
  • 您使用的是 .NET 5?您不能将try 直接放入@code 块中:它应该被包装在一个方法中。本质上,您将该代码放在类定义中,但它应该放在方法定义中。
  • @ConnorLow 谢谢,但这不是我想要的。我需要了解如何获取从DefaultSearch.razorIndex.razor 的提交数据以及从Index.razorSearchResultsPage.razor 的结果。
  • 我知道,这就是为什么它是一个评论 :) 我认为知道它仍然很有帮助,而且你的代码看起来太具体而不能作为一个例子,所以我问了。

标签: c# blazor .net-5


【解决方案1】:

您可以使用EventCallbacks 将值向上传递给父组件,并使用[Parameter]s 向下传递给子组件。这是您的组件名称的通用解决方案:

DefaultSearch.razor(子 A)

<input @bind-value="SearchValue" />
<button @onclick="Handle">Search</button>

@code{
    string SearchValue { get; set; }

    // Allows parent to listen for the 'click' event on the search button
    [Parameter]
    public EventCallback<string> OnClick { get; set; }

    async Task Handle()
    {
        if(OnClick.HasDelegate)
        {
            // Calls the EventCallback, passing the search term
            await OnClick.InvokeAsync(SearchValue);
        }
    }
}

Index.razor(父级):

<DefaultSearch OnClick="HandleSearch" />
<SearchResultsPage FetchedResults="Results" />

@code {
    SearchResultSet Results { get; set; }

    async Task HandleSearch(string searchTerm) {
        // However you need to get your results here:
        Results = await GetResultsForSearchTerm(searchTerm);

        // Signal a re-render from an async opperation.
        StateHasChanged();
    }
}

SearchResultsPage.cs(子 B):

<!-- markup here -->

@code {
    // Receive the result set here:
    [Parameter]
    public SearchResultSet FetchedResults { get; set; }
}

【讨论】:

  • 嗯……点击DefaultSearch.razor中的按钮似乎没有触发任何事情。
  • 取决于你告诉它做什么。请注意,正如我在帖子中所说,这是一个通用的解决方案。您需要提供自己的逻辑来填补空白;通过使用 VS 或 VS Code 在 Debug 中运行,或者使用 System.Console.WriteLine 来验证执行,确实不会“触发任何事情”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-12-14
  • 2016-04-20
  • 2021-05-02
  • 1970-01-01
  • 2018-04-24
  • 2020-07-30
  • 1970-01-01
相关资源
最近更新 更多