如何从另一个 Blazor ("child") 组件调用一个 Blazor(父)组件中的方法?
How do I call a method in one Blazor (parent) component from another Blazor ("child") component?
我正在构建我的第一个“真正的”Blazor 应用程序。目前,我正在开发一个搜索功能,让用户查询 API 并获得答案。我觉得我真的很接近这个,但我只需要一点指导。
在 DefaultSearch.razor
页面上,有一个绑定到 String
的文本输入,它作为参数传递给“主要”Blazor 组件(即 Index.razor
)。
我迷路的地方是如何从 DefaultSearch.razor
页面上的按钮触发该过程。我有一个 @onclick(doSomething)
,但我不知道在 doSomething
方法中做什么来启动这个过程。
Index.razor:
@page "/"
@inject IHttpClientFactory clientFactory
<div class="text-center">
@if (fetchedResults == null)
{
<HeaderLarge />
<DefaultSearch />
} else {
<HeaderSmall />
<SearchResultsPage FetchedResults="fetchedResults" />
}
</div>
@code {
[Parameter]
public String queryString { get; set; }
private async Task GetSearchResults()
{
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" @bind="queryString" /><button @onclick()>Search</button>
</div>
</div>
@code {
public String queryString;
public void doSomething(){
// What do I do here?
}
}
SearchResultsPage.razor:
<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; }
}
HeaderLarge.razor:
<h1> My Large Header </h1>
HeaderSmalal.razor:
<h5> My Small Header </h5>
希望以下内容对您有所帮助。注意添加到 DefaultSearch 参数的 OnClick 参数
Index.razor 变化
<DefaultSearch OnClick="SubmitSearch" />
public void SubmitSearch(string action)
{
if (action == "PerformSearch")
{
//any required code
}
}
DefaultSearch.razor 变化
[Parameter]
public EventCallback<string> OnClick { get; set; }
public void DoSomething()
{
OnClick.InvokeAsync("PerformSearch");
}
在我看来,您的索引页的整个代码体都在进行搜索,应该移至 DefaultSearch.razor 控件。所以 DoSomething()
实际上应该是 GetSearchResults()
。确保向 DefaultSearch.razor 添加一个变量以实际收集您的结果,并添加一个事件将它们传递回父级:
[Parameter]
SearchResultSet fetchedResults {get; set;}
[Parameter]
public EventCallback<SearchResultSet> fetchedResultsChanged { get; set; }
在搜索功能结束时,调用自定义事件:
. . .
fetchedResults = JsonConvert.DeserializeObject<SearchResultSet>(response);
fetchedResultsChanged.InvokeAsync(fetchedResults);
在 Index.razor:
<DefaultSearch @bind-fetchedResults=FetchedResults />
@code {
SearchResultSet FetchedResults {get; set;} // not a Parameter
}
评论:
- 要绑定变量,事件的命名必须完全是变量名 +“已更改”
- 我发现 Visual Studio 经常给我一个无法将
EventCallback<T>
转换为 EventCallback
的错误。我相信这是一个 Intellisense 错误。如果您收到该特定错误,请尝试 运行。
我正在构建我的第一个“真正的”Blazor 应用程序。目前,我正在开发一个搜索功能,让用户查询 API 并获得答案。我觉得我真的很接近这个,但我只需要一点指导。
在 DefaultSearch.razor
页面上,有一个绑定到 String
的文本输入,它作为参数传递给“主要”Blazor 组件(即 Index.razor
)。
我迷路的地方是如何从 DefaultSearch.razor
页面上的按钮触发该过程。我有一个 @onclick(doSomething)
,但我不知道在 doSomething
方法中做什么来启动这个过程。
Index.razor:
@page "/"
@inject IHttpClientFactory clientFactory
<div class="text-center">
@if (fetchedResults == null)
{
<HeaderLarge />
<DefaultSearch />
} else {
<HeaderSmall />
<SearchResultsPage FetchedResults="fetchedResults" />
}
</div>
@code {
[Parameter]
public String queryString { get; set; }
private async Task GetSearchResults()
{
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" @bind="queryString" /><button @onclick()>Search</button>
</div>
</div>
@code {
public String queryString;
public void doSomething(){
// What do I do here?
}
}
SearchResultsPage.razor:
<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; }
}
HeaderLarge.razor:
<h1> My Large Header </h1>
HeaderSmalal.razor:
<h5> My Small Header </h5>
希望以下内容对您有所帮助。注意添加到 DefaultSearch 参数的 OnClick 参数
Index.razor 变化
<DefaultSearch OnClick="SubmitSearch" />
public void SubmitSearch(string action)
{
if (action == "PerformSearch")
{
//any required code
}
}
DefaultSearch.razor 变化
[Parameter]
public EventCallback<string> OnClick { get; set; }
public void DoSomething()
{
OnClick.InvokeAsync("PerformSearch");
}
在我看来,您的索引页的整个代码体都在进行搜索,应该移至 DefaultSearch.razor 控件。所以 DoSomething()
实际上应该是 GetSearchResults()
。确保向 DefaultSearch.razor 添加一个变量以实际收集您的结果,并添加一个事件将它们传递回父级:
[Parameter]
SearchResultSet fetchedResults {get; set;}
[Parameter]
public EventCallback<SearchResultSet> fetchedResultsChanged { get; set; }
在搜索功能结束时,调用自定义事件:
. . .
fetchedResults = JsonConvert.DeserializeObject<SearchResultSet>(response);
fetchedResultsChanged.InvokeAsync(fetchedResults);
在 Index.razor:
<DefaultSearch @bind-fetchedResults=FetchedResults />
@code {
SearchResultSet FetchedResults {get; set;} // not a Parameter
}
评论:
- 要绑定变量,事件的命名必须完全是变量名 +“已更改”
- 我发现 Visual Studio 经常给我一个无法将
EventCallback<T>
转换为EventCallback
的错误。我相信这是一个 Intellisense 错误。如果您收到该特定错误,请尝试 运行。