Blazor.net UI 没有渲染任何东西
Blazor.net UI not Rendering anything
我正在开发一个 Blaor.Net 应用程序,参考了 Internet 上许多 post 可用的内容。我面临的问题是我想将代码从 UI 移动到一个单独的文件以保持 razor 文件清晰可读和可理解。为此,我将我的 UI 侧 C# 代码保留在一个单独的组件中,该组件继承自 BaseComponent
@page "/Item"
@using WebApplication1.Shared
@using WebApplication1.Client.Services;
@inherits ItemComponent
@if (ItemList != null)
{
<table class="table">
<thead>
<tr>
<th>ID</th>
<th>Name</th>
<th>Category</th>
<th>Metal</th>
<th>Price</th>
<th>Quantity</th>
</tr>
</thead>
<tbody>
@foreach (var item in ItemList)
{
<tr>
<td>@item.ID</td>
<td>@item.Name</td>
<td>@item.Category</td>
<td>@item.Metal</td>
<td>@item.Price</td>
<td>@item.Quantity</td>
</tr>
}
</tbody>
</table>
}
@functions{
public List<ItemModel> ItemList;
ItemComponent IC = new ItemComponent();
protected override async Task OnInitAsync()
{
ItemList = IC.GetItems().Result;
}
}
ItemComponent.cs
public class ItemComponent : ComponentBase
{
private string BaseUrl = "http://localhost:52114/";
public async Task<List<ItemModel>> GetItems()
{
HttpClient Http = new HttpClient();
return await Http.GetJsonAsync<List<ItemModel>>(BaseUrl + "api/Item/GetItems");
}
}
我不想在 UI 中进行 api 调用,而是希望将其放在单独的文件中,组件基本上用作此处剃刀页面的代码隐藏文件
Http.GetJsonAsync>(BaseUrl + "api/Item/GetItems");
但是在创建组件并将其继承到 razor 之后它抛出异常
System.Net.Http.HttpRequestException: No connection could be made because the target machine actively refused it. --->
System.Net.Sockets.SocketException: No connection could be made
because the target machine actively refused it. at
System.Net.Http.ConnectHelper.ConnectAsync(String host, Int32 port,
CancellationToken cancellationToken) --- End of inner exception stack
trace --- at System.Net.Http.ConnectHelper.ConnectAsync(String host,
Int32 port, CancellationToken cancellationToken) at
System.Threading.Tasks.ValueTask1.get_Result() at
System.Net.Http.HttpConnectionPool.ConnectAsync(HttpRequestMessage
request, Boolean allowHttp2, CancellationToken cancellationToken)
at System.Threading.Tasks.ValueTask1.get_Result() at
System.Net.Http.HttpConnectionPool.CreateHttp11ConnectionAsync(HttpRequestMessage
request, CancellationToken cancellationToken) at
System.Threading.Tasks.ValueTask1.get_Result() at
System.Net.Http.HttpConnectionPool.GetHttpConnectionAsync(HttpRequestMessage
request, CancellationToken cancellationToken) at
System.Threading.Tasks.ValueTask1.get_Result() at
System.Net.Http.HttpConnectionPool.SendWithRetryAsync(HttpRequestMessage
request, Boolean doRequestAuth, CancellationToken cancellationToken)
at System.Net.Http.RedirectHandler.SendAsync(HttpRequestMessage
request, CancellationToken cancellationToken) at
System.Net.Http.HttpClient.FinishSendAsyncUnbuffered(Task1 sendTask,
HttpRequestMessage request, CancellationTokenSource cts, Boolean
disposeCts) at System.Net.Http.HttpClient.GetStringAsyncCore(Task1
getTask) at
Microsoft.AspNetCore.Builder.BlazorMonoDebugProxyAppBuilderExtensions.GetOpenedBrowserTabs(String
debuggerHost) at
Microsoft.AspNetCore.Builder.BlazorMonoDebugProxyAppBuilderExtensions.DebugHome(HttpContext
context)
浏览器在此异常后挂起,无法关闭,只能通过任务管理器
所以您还有一点重构要做。正如我在回答您之前的问题时所说,您需要将所有内容从 functions
块移动到后面的代码中。使用基础 class 时,您 不应 将其与视图中的 functions
块混合。
就您的 http 调用而言,您不需要添加基础 URL 这已经为您完成,但您也不应该新建 HTTP 客户端。你应该在你的代码后面注入一个实例。
您的代码中还有其他一些小问题,因此我认为重新编写它以显示其外观可能更容易。
@page "/Item"
@inherits ItemComponent
@if (ItemList != null)
{
<table class="table">
<thead>
<tr>
<th>ID</th>
<th>Name</th>
<th>Category</th>
<th>Metal</th>
<th>Price</th>
<th>Quantity</th>
</tr>
</thead>
<tbody>
@foreach (var item in ItemList)
{
<tr>
<td>@item.ID</td>
<td>@item.Name</td>
<td>@item.Category</td>
<td>@item.Metal</td>
<td>@item.Price</td>
<td>@item.Quantity</td>
</tr>
}
</tbody>
</table>
}
public class ItemComponent : ComponentBase
{
[Inject] HttpClient HttpClient { get; set; }
public List<ItemModel> ItemList;
protected override async Task OnInitAsync()
{
ItemList = await GetItems();
}
public async Task<List<ItemModel>> GetItems()
{
return await HttpClient.GetJsonAsync<List<ItemModel>>("api/Item/GetItems");
}
}
只要您的后端设置正确(示例:CORS),这应该会按预期工作。
我正在开发一个 Blaor.Net 应用程序,参考了 Internet 上许多 post 可用的内容。我面临的问题是我想将代码从 UI 移动到一个单独的文件以保持 razor 文件清晰可读和可理解。为此,我将我的 UI 侧 C# 代码保留在一个单独的组件中,该组件继承自 BaseComponent
@page "/Item"
@using WebApplication1.Shared
@using WebApplication1.Client.Services;
@inherits ItemComponent
@if (ItemList != null)
{
<table class="table">
<thead>
<tr>
<th>ID</th>
<th>Name</th>
<th>Category</th>
<th>Metal</th>
<th>Price</th>
<th>Quantity</th>
</tr>
</thead>
<tbody>
@foreach (var item in ItemList)
{
<tr>
<td>@item.ID</td>
<td>@item.Name</td>
<td>@item.Category</td>
<td>@item.Metal</td>
<td>@item.Price</td>
<td>@item.Quantity</td>
</tr>
}
</tbody>
</table>
}
@functions{
public List<ItemModel> ItemList;
ItemComponent IC = new ItemComponent();
protected override async Task OnInitAsync()
{
ItemList = IC.GetItems().Result;
}
}
ItemComponent.cs
public class ItemComponent : ComponentBase
{
private string BaseUrl = "http://localhost:52114/";
public async Task<List<ItemModel>> GetItems()
{
HttpClient Http = new HttpClient();
return await Http.GetJsonAsync<List<ItemModel>>(BaseUrl + "api/Item/GetItems");
}
}
我不想在 UI 中进行 api 调用,而是希望将其放在单独的文件中,组件基本上用作此处剃刀页面的代码隐藏文件
Http.GetJsonAsync>(BaseUrl + "api/Item/GetItems");
但是在创建组件并将其继承到 razor 之后它抛出异常
System.Net.Http.HttpRequestException: No connection could be made because the target machine actively refused it. ---> System.Net.Sockets.SocketException: No connection could be made because the target machine actively refused it. at System.Net.Http.ConnectHelper.ConnectAsync(String host, Int32 port, CancellationToken cancellationToken) --- End of inner exception stack trace --- at System.Net.Http.ConnectHelper.ConnectAsync(String host, Int32 port, CancellationToken cancellationToken) at System.Threading.Tasks.ValueTask1.get_Result() at
System.Net.Http.HttpConnectionPool.ConnectAsync(HttpRequestMessage
request, Boolean allowHttp2, CancellationToken cancellationToken)at System.Threading.Tasks.ValueTask1.get_Result() at System.Net.Http.HttpConnectionPool.CreateHttp11ConnectionAsync(HttpRequestMessage request, CancellationToken cancellationToken) at System.Threading.Tasks.ValueTask1.get_Result() at
System.Net.Http.HttpConnectionPool.GetHttpConnectionAsync(HttpRequestMessage request, CancellationToken cancellationToken) at
System.Threading.Tasks.ValueTask1.get_Result() at System.Net.Http.HttpConnectionPool.SendWithRetryAsync(HttpRequestMessage request, Boolean doRequestAuth, CancellationToken cancellationToken) at System.Net.Http.RedirectHandler.SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) at System.Net.Http.HttpClient.FinishSendAsyncUnbuffered(Task1 sendTask,
HttpRequestMessage request, CancellationTokenSource cts, Boolean
disposeCts) at System.Net.Http.HttpClient.GetStringAsyncCore(Task1 getTask) at Microsoft.AspNetCore.Builder.BlazorMonoDebugProxyAppBuilderExtensions.GetOpenedBrowserTabs(String debuggerHost) at Microsoft.AspNetCore.Builder.BlazorMonoDebugProxyAppBuilderExtensions.DebugHome(HttpContext context)
浏览器在此异常后挂起,无法关闭,只能通过任务管理器
所以您还有一点重构要做。正如我在回答您之前的问题时所说,您需要将所有内容从 functions
块移动到后面的代码中。使用基础 class 时,您 不应 将其与视图中的 functions
块混合。
就您的 http 调用而言,您不需要添加基础 URL 这已经为您完成,但您也不应该新建 HTTP 客户端。你应该在你的代码后面注入一个实例。
您的代码中还有其他一些小问题,因此我认为重新编写它以显示其外观可能更容易。
@page "/Item"
@inherits ItemComponent
@if (ItemList != null)
{
<table class="table">
<thead>
<tr>
<th>ID</th>
<th>Name</th>
<th>Category</th>
<th>Metal</th>
<th>Price</th>
<th>Quantity</th>
</tr>
</thead>
<tbody>
@foreach (var item in ItemList)
{
<tr>
<td>@item.ID</td>
<td>@item.Name</td>
<td>@item.Category</td>
<td>@item.Metal</td>
<td>@item.Price</td>
<td>@item.Quantity</td>
</tr>
}
</tbody>
</table>
}
public class ItemComponent : ComponentBase
{
[Inject] HttpClient HttpClient { get; set; }
public List<ItemModel> ItemList;
protected override async Task OnInitAsync()
{
ItemList = await GetItems();
}
public async Task<List<ItemModel>> GetItems()
{
return await HttpClient.GetJsonAsync<List<ItemModel>>("api/Item/GetItems");
}
}
只要您的后端设置正确(示例:CORS),这应该会按预期工作。