当我尝试注入 HttpClient 时,我在 razor 页面中收到错误:
未处理的承诺拒绝:错误:System.InvalidOperationException:无法为类型上的属性“Http”提供值。没有“System.Net.Http.HttpClient”类型的注册服务。
请审查并提供反馈。
我正在学习,并看到 2 种类型和Blazor的好处。client-sideserver-side
我想在同一个网络上使用两者,例如一个路径是client-side WebAssembly应用程序,另一个路径是server-side在服务器中运行代码的路径。
我见过Blazor Full-Stack模板(不太明白),但最新的模板包中缺少它。他们是故意删除的吗?(只剩下 2 个Blazor Server App和 Blazor WebAssembly App)
我从这个命令下载模板。
dotnet new -i Microsoft.AspNetCore.Blazor.Templates::3.0.0-preview9.19465.2
可以client-side和server-side合作吗?
blazor blazor-server-side asp.net-core-3.0 blazor-client-side
我正在尝试构建一个托管在服务器上的 Blazor 应用程序,起点位于一个 razor 页面内。类似的东西:
<component type="typeof(Main)" render-mode="ServerPrerendered" param-Data="@simple"/>
Run Code Online (Sandbox Code Playgroud)
我的问题是:
如果我的 razor 页面确实具有基于OnGetAsync方法内的数据库值的自定义身份验证- 我是否需要在 blazor 中重做某些内容,或者只有在 razor 页面工作时才呈现有状态组件?
如果我有一个具有按钮调用的任意 if/else 块会发生什么,该按钮调用是否会受到状态的保护?
沿线的东西:
@if (HasPermission)
{
<button type="button" onclick="MutateDatabase">MutateDatabase</button>
}
Run Code Online (Sandbox Code Playgroud) 每当从消息队列收到消息时,我都试图获取要更新的项目列表。
这只似乎每个工作等收到虽然消息的时间。它肯定SubscribeAsync每次都在调用内部调用匿名方法,我无法弄清楚为什么它不是每次都更新。我假设它与位于不同线程中的匿名方法有关。任何想法我做错了什么?
@page "/"
@inject IMessageQueueHelperFactory MessageQueueHelperFactory
@inject ILogger<Index> Logger
@using Microsoft.Extensions.Logging
@using Newtonsoft.Json
<ul class="list-group">
@foreach (var user in Users) {
<li class="list-group-item">@user</li>
}
</ul>
@code
{
private List<string> Users { get; set; } = new List<string>();
protected override void OnInitialized()
{
MessageQueueHelperFactory.Create(Queues.UserRegistration)
.SubscribeAsync(async x =>
{
var user = JsonConvert.DeserializeObject<UserRegistrationData>(x);
Users.Add(user.Username);
await InvokeAsync(StateHasChanged);
});
base.OnInitialized();
}
}
Run Code Online (Sandbox Code Playgroud) 我在 blazor 组件中有以下剃刀标记:
<div class="form-group row">
<label for="name">Contact: </label>
<InputText id="name" @bind-Value="Contact.Name" @onchange="NameChanged"></InputText>
</div>
Run Code Online (Sandbox Code Playgroud)
当我修改表单上的联系人姓名和选项卡时,该NameChange方法永远不会被调用。为了onChange触发事件,我还需要做些什么吗?
我有一个使用编辑上下文的编辑表单:
<EditForm OnValidSubmit="HandleValidSubmit" EditContext="_editContext" Context="auth">
<DataAnnotationsValidator />
<input type="time" @bind-value="_foodTruck.EndDelivery" @onkeydown="@(q=>ResetValidation("EndDelivery"))" >
<ValidationMessage For="() => _foodTruck.EndDelivery" />
<input type="time" @bind-value="_foodTruck.StartDelivery" @onkeydown="@(q=>ResetValidation("StartDelivery"))" >
<ValidationMessage For="() => _foodTruck.StartDelivery" />
<input class="btn btn-default" type="submit" value="save" />
</EditForm>
Run Code Online (Sandbox Code Playgroud)
我在 HandleValidSubmit 中做了一些自定义验证:
EditContext _editContext = new EditContext(_foodTruck);
private async void HandleValidSubmit()
{
var messageStore = new ValidationMessageStore(_editContext);
if (_foodTruck.StartDelivery >= _foodTruck.EndDelivery)
{
messageStore.Add(_editContext.Field("EndDelivery"), "Bad time entered");
_editContext.NotifyValidationStateChanged();
}
if (!_editContext.Validate()) return;
}
Run Code Online (Sandbox Code Playgroud)
现在发生的是我的自定义错误(“输入的错误时间”)显示在正确的位置。唯一的问题是:当我更改值时,该错误不会消失。因此,如果我单击提交按钮,则永远不会再次调用 HandleValidSubmit。
我还尝试在修改字段时清空验证错误:
protected void ResetValidation(string field)
{
var messageStore = new ValidationMessageStore(_editContext); …Run Code Online (Sandbox Code Playgroud) 我想_Host.cshtml根据请求中的标头在 ASP.NET Core Blazor 项目(服务器端 Blazor)中加载一个文件。
例如:
一个客户端连接example.com并被重定向到一个_Host.cshtml特定于租户 A的文件。另一个客户端连接test.com并被重定向到一个_Host.cshtml特定于租户 B的文件。
该_Host.cshtml文件看起来像这样:
@page
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
<!DOCTYPE html>
<html lang="en" dir="ltr">
<head>
<meta http-equiv="content-type" content="text/html;charset=UTF-8" />
<meta charset="utf-8" />
<title>ProjectName</title>
<link rel="icon" type="image/png" sizes="32x32" href="images/tenantA/favicons/favicon-32x32.png">
<link rel="icon" type="image/png" sizes="16x16" href="images/tenantA/favicons/favicon-16x16.png">
</head>
<body class="something">
<app>
@(await Html.RenderComponentAsync<App>(RenderMode.Server))
</app>
<script src="_framework/blazor.server.js"></script>
<link href="css/tenantA/site.css" rel="stylesheet" />
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
在该_Host.cshtml文件中,tenantA需要根据上述租户 URL 中的上述租户选择来设置引用。这是可能的,如果是,如何实现?
为什么Blazor UI在删除事件后不更新:
我的组件:
<table class="table table-striped">
<thead>
<tr>
<th>Id</th>
<th>Name</th>
<th>Example</th>
<th></th>
</tr>
</thead>
<tbody>
@foreach (var trainingTechnique in TrainingTechniques) {
<tr>
<td>@trainingTechnique.Id</td>
<td>@trainingTechnique.Name</td>
<td>@trainingTechnique.Example</td>
<td>
<button type="button"
class="btn btn-danger"
@onclick="@(async () => await DeleteTechnique(trainingTechnique.Id))">
Delete
</button>
</td>
</tr>
}
</tbody>
</table>
Run Code Online (Sandbox Code Playgroud)
我后面的组件代码:
public class TrainingTechniqueViewPageBase : ComponentBase
{
public List<TrainingTechniqueView> TrainingTechniques { get; set; }
[Inject]
public ITrainingTechniqueConsumer TrainingTechniqueConsumer { get; set; }
protected TrainingTechniqueForm TrainingTechniqueForm { get; set; }
protected override async Task OnInitializedAsync()
{
TrainingTechniques …Run Code Online (Sandbox Code Playgroud) 在使用 blazor 时,我希望能够“返回”到我之前所在的页面。
我发现了这个问题,看起来它是一个死胡同?
这个功能太基础了,我不敢相信它不存在。
是否有任何走动可以使此“返回”功能?
请注意,我不能使用window.goBack或history.goBack因为我的应用程序没有创建任何历史记录,也不应该创建任何历史记录。
“创建”历史记录的唯一方法是使用forceLoad选项,Navigation.NavigateTo但如果我这样做,它会尝试再次加载我的整个应用程序,这很慢,我不想。
我想在服务器端和客户端之间使用基于角色的授权。
我可以正确登录并UserManager.IsInRoleAsync(user, "admin")在服务器端返回 True 。
但是在客户端既不工作@attribute [Authorize(Roles = "admin")]也不行<AuthorizeView Roles="admin">。User.Identity.IsInRole("admin")在客户端也返回 False。
如何在客户端获取用户的角色?
// Startup.ConfigureServices()
services.AddDefaultIdentity<ApplicationUser>(options =>
{
options.SignIn.RequireConfirmedAccount = true;
options.Password.RequiredLength = 6;
options.Password.RequiredUniqueChars = 2;
options.Password.RequireNonAlphanumeric = false;
options.User.RequireUniqueEmail = true;
})
.AddRoles<IdentityRole>()
.AddEntityFrameworkStores<ApplicationDbContext>();
services.AddIdentityServer()
.AddApiAuthorization<ApplicationUser, ApplicationDbContext>();
services.AddAuthentication()
.AddIdentityServerJwt();
Run Code Online (Sandbox Code Playgroud)
// Startup.Configure()
app.UseIdentityServer();
app.UseAuthentication();
app.UseAuthorization();
Run Code Online (Sandbox Code Playgroud)
// RolesController.Get()
var userid = HttpContext.User.FindFirstValue(ClaimTypes.NameIdentifier);
var currentUser = await …Run Code Online (Sandbox Code Playgroud) c# asp.net blazor-server-side blazor-client-side blazor-webassembly
blazor ×7
c# ×4
asp.net-core ×3
asp.net ×2
razor ×2
.net ×1
asynchronous ×1
events ×1
inject ×1
multi-tenant ×1
razor-pages ×1
validation ×1