标签: blazor-server-side

无法在 Razor 组件中呈现原始 html

我在 ASP.Core 3.0 razor pages (normal) 项目中有以下 Razor 组件(Blazor 服务器端?):

@using WEKA.Models
@using Microsoft.AspNetCore.Html

<div class="jobs-list">
    @foreach (var e in News)
    {
        <div class="job" data-aos="fade-up">
            <a href="@e.Link">
                <div class="col name">@e.Text)</div>
                <div class="col more">Detail</div>
            </a>
        </div>
    }
</div>

@code {

    public List<QNewsList> News
    {
        set { }
        get
        {
            using (WEKAContext db = new WEKAContext())
            {
                var q = from n in db.Qaktuality select new QNewsList() { Datum = n.Datum.ToString("d.M.YYYY"), Text = new HtmlString(n.Text), Link = n.RssLink };
                return q.ToList();
            } …
Run Code Online (Sandbox Code Playgroud)

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

7
推荐指数
2
解决办法
4369
查看次数

动态呈现 Blazor 组件的推荐方法是什么?

我是 Blazor 的新手,具有基本的 Angular 和 Vue.js 经验。我想呈现多态组件的列表:

<ul>
    @foreach (fruit of fruits) 
         <li>HOW DO I RENDER FRUIT HERE??? </li> // render the fruit component
</ul>

@code {
   // Each member in the list is a subtype of Fruit
   var fruits = List<FruitComponent> {
       new PearComponent(),
       new AppleComponent()'
       new BananaComponent(),
       new RasberryComponent()
}
Run Code Online (Sandbox Code Playgroud)

从我收集到的信息来看,有几种方法可以实现这一点,每种方法都有自己的缺点。一个不常见的建议是使用未记录的 API 调用,它可能会在没有通知的情况下被弃用,但它似乎几乎是理想的。另一个建议在代码中发出标记,这会带回编写 ASP.NET 服务器控件的乏味。最后,最常见的建议是使用条件标记,虽然非常简单,但它将呈现代码与其正在呈现的组件耦合。

我读过的大多数文档可能已经过时,不再相关。随着 Blazor 的正式发布,实现这一目标的推荐方法是什么?

blazor blazor-server-side

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

在 Blazor 中延迟任务而不阻塞 UI

我在 Blazor 中创建了一个 .razor 通知组件,我试图在 xx 秒后自动关闭通知 div。

到目前为止,它适用于这种方法

 private async Task CloseToast(Guid Id, bool autoclose = false)
{
    if (autoclose)
    {
        await Task.Delay(TimeSpan.FromSeconds(5));
    }

   //Code to remove the notification from list
    StateHasChanged();
}
Run Code Online (Sandbox Code Playgroud)

问题是 UI 数据绑定卡住了 5 秒钟,任何一种或两种方式绑定更新到变量(文本字段等)都被暂停,直到通知关闭并且任务恢复。

如何在 xx 秒后启动方法或代码块而不阻塞 Blazor 中的主 UI 任务?

asp.net-core blazor blazor-server-side

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

登录 Blazor 服务器端应用程序不起作用

我正在为 Asp.net 核心 3.0 Blazor 服务器端应用程序构建示例登录 razor 组件。每当代码到达 SignInAsyc 方法时,它似乎只是挂起或锁定,因为代码停止进一步执行。我还尝试通过使用 PasswordSignInAsync 方法来切换逻辑,这给了我完全相同的结果。所有代码都将在该方法之前执行,但在执行该语句时会冻结。我在这里缺少什么?

Razor 组件页面:

<div class="text-center">
    <Login FieldsetAttr="fieldsetAttr" UsernameAttr="usernameAttr" PasswordAttr="passwordInput"
           ButtonAttr="buttonAttr" ButtonText="Sign In" InvalidAttr="invalidAttr" />

</div>

@code {
    Dictionary<string, object> fieldsetAttr =
        new Dictionary<string, object>()
        {
            {"class", "form-group" }
        };

    Dictionary<string, object> usernameAttr =
        new Dictionary<string, object>()
        {
            {"class", "form-control" },
            {"type", "text" },
            {"placeholder", "Enter your user name here." }
        };

    Dictionary<string, object> passwordInput =
        new Dictionary<string, object>()
        {
            {"class", "form-control" },
            {"type", "password" }
        };

    Dictionary<string, object> buttonAttr …
Run Code Online (Sandbox Code Playgroud)

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

7
推荐指数
2
解决办法
4838
查看次数

如何在自定义组件 Blazor 上使用绑定值和绑定值:事件

在 Blazor 中,在使用输入时,

<input bind-value="@InputValue" bind-value:event="oninput"/>
Run Code Online (Sandbox Code Playgroud)

这将创建一个随 oninput 事件更新的 2 路绑定。

我想在具有自定义事件和自定义属性的自定义组件上重新创建它。

自定义输入.razor

<input value="@Value" oninput="@OnInput" />

@code {
   [Parameter]
   public string Value { get; set; }

   [Parameter]
   public EventCallback<ChangeEventArgs> OnInput { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我希望能够以这种方式使用它。

<CustomInput bind-Value="@InputValue" bind-Value:event="OnInput" />
Run Code Online (Sandbox Code Playgroud)

现在可以在 Blazor 上实现吗?如果是,我如何实现它?

编辑:

对于遇到此问题的任何人,它似乎都按原样工作。我不确定是否在提出问题后添加了该功能,或者它是否总是以这种方式工作,但上面的代码应该按原样工作。按照惯例,您的事件名称应该是ValueChanged但如果您有理由使用另一个事件名称,例如在具有OnInputOnChange 的输入中,那么您可以使用这种格式。

asp.net-core blazor blazor-server-side

7
推荐指数
2
解决办法
2万
查看次数

如何在 Blazor 服务器端更新多个用户?

假设我想要一个用户界面,其中组中的用户具有同步视图。想象一个群聊应用程序,群中的每个人都应该看到完全相同的消息。

当用户向群组发布消息时,整个群组都需要接收它。

使用 JS,我可能会使用 SignalR 组,并让前端生成一个 SignalR 事件,并发布一条消息。服务器端集线器然后将该消息发送给该组。

在服务器端 Blazor 上,由于所有用户的状态都已经在服务器上,我将如何协调更新 Blazor 上用户组的 UI?

signalr blazor blazor-server-side

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

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
查看次数