我在 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) 我是 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 中创建了一个 .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 核心 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) 在 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但如果您有理由使用另一个事件名称,例如在具有OnInput和OnChange 的输入中,那么您可以使用这种格式。
假设我想要一个用户界面,其中组中的用户具有同步视图。想象一个群聊应用程序,群中的每个人都应该看到完全相同的消息。
当用户向群组发布消息时,整个群组都需要接收它。
使用 JS,我可能会使用 SignalR 组,并让前端生成一个 SignalR 事件,并发布一条消息。服务器端集线器然后将该消息发送给该组。
在服务器端 Blazor 上,由于所有用户的状态都已经在服务器上,我将如何协调更新 Blazor 上用户组的 UI?
我正在尝试构建一个托管在服务器上的 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)