标签: blazor-server-side

服务器端 Blazor 不提供 HttpClient 进行注入

当我尝试注入 HttpClient 时,我在 razor 页面中收到错误:

未处理的承诺拒绝:错误:System.InvalidOperationException:无法为类型上的属性“Http”提供值。没有“System.Net.Http.HttpClient”类型的注册服务。

请审查并提供反馈。

.net inject blazor-server-side

7
推荐指数
1
解决办法
5549
查看次数

如何在同一个 Web 中同时使用 Blazor 客户端和服务器

我正在学习,并看到 2 种类型和Blazor的好处。client-sideserver-side

我想在同一个网络上使用两者,例如一个路径是client-side WebAssembly应用程序,另一个路径是server-side在服务器中运行代码的路径。

我见过Blazor Full-Stack模板(不太明白),但最新的模板包中缺少它。他们是故意删除的吗?(只剩下 2 个Blazor Server AppBlazor WebAssembly App

我从这个命令下载模板。

dotnet new -i Microsoft.AspNetCore.Blazor.Templates::3.0.0-preview9.19465.2

可以client-sideserver-side合作吗?

blazor blazor-server-side asp.net-core-3.0 blazor-client-side

7
推荐指数
1
解决办法
3707
查看次数

Blazor 安全性 - Razor Pages 自定义身份验证/安全性

我正在尝试构建一个托管在服务器上的 Blazor 应用程序,起点位于一个 razor 页面内。类似的东西:

<component type="typeof(Main)" render-mode="ServerPrerendered" param-Data="@simple"/>
Run Code Online (Sandbox Code Playgroud)

我的问题是:

  • 如果剃刀页面具有授权属性,所有 blazor 代码都不是通过身份验证正确保护的,会发生什么?
  • 没有剃刀页面电路 id 就不可能调用 blazor 应用程序吗?
  • 如果我的 razor 页面确实具有基于OnGetAsync方法内的数据库值的自定义身份验证- 我是否需要在 blazor 中重做某些内容,或者只有在 razor 页面工作时才呈现有状态组件?

  • 如果我有一个具有按钮调用的任意 if/else 块会发生什么,该按钮调用是否会受到状态的保护?

沿线的东西:

@if (HasPermission)
{
   <button type="button" onclick="MutateDatabase">MutateDatabase</button>
}
Run Code Online (Sandbox Code Playgroud)

razor asp.net-core razor-pages blazor-server-side

7
推荐指数
1
解决办法
3416
查看次数

从另一个线程更新 Blazor 中的项目列表

每当从消息队列收到消息时,我都试图获取要更新的项目列表。

这只似乎每个工作收到虽然消息的时间。它肯定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)

c# asp.net-core blazor blazor-server-side

7
推荐指数
1
解决办法
1120
查看次数

为什么在 Blazor 中不会触发 InputText 的 onChange 事件?

我在 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触发事件,我还需要做些什么吗?

events blazor blazor-server-side

7
推荐指数
4
解决办法
5620
查看次数

在 blazor razor 页面中使用 editform 时如何重置自定义验证错误

我有一个使用编辑上下文的编辑表单:

    <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)

validation razor blazor blazor-server-side

7
推荐指数
5
解决办法
5135
查看次数

ASP.Net Core Blazor:如何根据标头值加载不同的 _Host.cshtml 文件

我想_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 中的上述租户选择来设置引用。这是可能的,如果是,如何实现?

c# asp.net multi-tenant blazor blazor-server-side

7
推荐指数
1
解决办法
4477
查看次数

为什么 Blazor UI 组件在删除事件后没有更新?

为什么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)

c# asynchronous asp.net-core blazor blazor-server-side

7
推荐指数
1
解决办法
1365
查看次数

Blazor 导航管理器返回?

在使用 blazor 时,我希望能够“返回”到我之前所在的页面。

我发现了这个问题,看起来它是一个死胡同?

这个功能太基础了,我不敢相信它不存在。

是否有任何走动可以使此“返回”功能?

请注意,我不能使用window.goBackhistory.goBack因为我的应用程序没有创建任何历史记录,也不应该创建任何历史记录。

“创建”历史记录的唯一方法是使用forceLoad选项,Navigation.NavigateTo但如果我这样做,它会尝试再次加载我的整个应用程序,这很慢,我不想。

blazor blazor-server-side blazor-client-side

7
推荐指数
4
解决办法
5844
查看次数

如何在blazor wasm客户端授权用户的角色?

环境

  • Asp.Net 核心 5.0
  • Blazor WebAssembly 应用程序(Asp.Net 核心托管)
  • Asp.Net Core Identity(使用 Identity Server 4)

问题

我想在服务器端和客户端之间使用基于角色的授权。

我可以正确登录并UserManager.IsInRoleAsync(user, "admin")在服务器端返回 True 。

但是在客户端既不工作@attribute [Authorize(Roles = "admin")]也不行<AuthorizeView Roles="admin">User.Identity.IsInRole("admin")在客户端也返回 False。

如何在客户端获取用户的角色?

代码

服务器.csproj

// 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

7
推荐指数
1
解决办法
2452
查看次数