标签: blazor-server-side

OnPostAsync 未调用

我尝试在 Blazor 服务器端应用程序中实现电子邮件发送器。我正在遵循这个例子:

https://kenhaggerty.com/articles/article/aspnet-core-22-smtp-emailsender-implementation

我有Home.cshtml视图

@page "/Home"
@model UserManagement.HomeModel
@{
    ViewData["Title"] = "Home";

}

<div class="row">
    <div class="col-6">
        <label class="alert alert-success">@Model.EmailStatusMessage</label>
    </div>
</div>
<div class="row">
    <div class="col-6">
        <form method="post">
            <div class="form-group">
                <label asp-for="Email"></label>
                <input asp-for="Email" class="form-control" />
                <span asp-validation-for="Email" class="text-danger"></span>
            </div>
            <button type="submit" class="btn btn-primary">Email Test</button>
        </form>
    </div>
</div>
Run Code Online (Sandbox Code Playgroud)

Home.cshtml.cs

 public class HomeModel : PageModel
    {
        private readonly IEmailSender _emailSender;

        public HomeModel(IEmailSender emailSender)
        {
            _emailSender = emailSender;
        }

        public string EmailStatusMessage { get; set; }

        [Required]
        [BindProperty]
        public …
Run Code Online (Sandbox Code Playgroud)

asp.net-core blazor-server-side

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

Blazor 自定义身份验证提供程序错误

我正在创建一个 Blazor UI 应用程序来与 API 对话。目前,我正在尝试为此工作获取自定义提供程序,但出现了一些错误。

这是客户 AuthenticationStateProvider

public class APIAuthenticationStateProvider : AuthenticationStateProvider
{
    private readonly HttpClient _httpClient;
    private readonly ILocalStorageService _localStorage;
    public APIAuthenticationStateProvider(HttpClient httpClient, ILocalStorageService localStorage)
    {
        _httpClient = httpClient;
        _localStorage = localStorage;
    }
    public override async Task<AuthenticationState> GetAuthenticationStateAsync()
    {
        var token = await _localStorage.GetItemAsync<string>("authToken");

        if (string.IsNullOrWhiteSpace(token))
        {
            return new AuthenticationState(new ClaimsPrincipal(new ClaimsIdentity()));
        }

        _httpClient.DefaultRequestHeaders.Authorization =
            new AuthenticationHeaderValue("bearer", token);

        var claims = ParseClaims(token);

        return new AuthenticationState(new ClaimsPrincipal(new ClaimsIdentity(claims,"jwt")));
    }
}
Run Code Online (Sandbox Code Playgroud)

我在 Startup.cs 文件中的配置服务功能如下所示

public void ConfigureServices(IServiceCollection services)
{
    services.AddRazorPages(); …
Run Code Online (Sandbox Code Playgroud)

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

1
推荐指数
2
解决办法
1212
查看次数

在 EventHandler 中调用 this.StateHasChanged

我有以下问题。我创建了一个事件并订阅了它,现在我希望在事件触发时 UI 发生变化。

 using System;
 using MintWebApp.Data;
 using MintWebApp.Models;
 using Microsoft.AspNetCore.Components;
 namespace WebApp.UI.Core
 {
    public partial class AppHeader
    {
        public string status { get; set; }
        [Inject]
        public StateService state { get; set; }

        EventHandler<string> onStatusChanged= (sender, eventArgs) => {

            //Here i get the error, I can't access this and status
            status = eventArgs;
            this.StateHasChanged();
            Console.WriteLine(eventArgs.PatientName);
        };

        protected override void OnInitialized() => state.StatusHandler += onStatusChanged;
    }

}
Run Code Online (Sandbox Code Playgroud)

我收到此错误字段初始值设定项无法引用非静态字段、方法或属性“AppHeader.patientContext”

关键字“this”在当前上下文中不可用

如何订阅事件并更新 UI

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

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

Blazor 服务器端在 IIS 上提交表单

我有一个带有表单提交的 Blazor 服务器端项目:

        <EditForm Model="@myWebUserVM" OnValidSubmit="HandleValidSubmit">
            <DataAnnotationsValidator />
            <ValidationSummary />
            @if (IsPasswordIncorrect)
            {<h6 class="text-danger">User Name or Password is incorrect.</h6>}
            <div class="row">
                <label class="col-md-4">User Name:</label>
                <div class="col-md-8">
                    <InputText id="uname" class="form-control" placeholder="User Name" @bind-Value="myWebUserVM.UserName" />
                </div>
            </div>
            <div class="row my-3">
                <label class="col-md-4">Password:</label>
                <div class="col-md-8">
                    <InputText id="upassword" class="form-control" type="password" placeholder="Password" @bind-Value="myWebUserVM.Password" />
                </div>
            </div>
            <div class="text-center">
                <button class="btn btn-outline-success" type="submit">Login</button>
            </div>
        </EditForm>
Run Code Online (Sandbox Code Playgroud)

当我在 VS2019 本地运行它时,效果非常好。当我发布到 IIS 时,表单的工作方式有所不同。点击提交按钮将 http post 到服务器,页面/表单将重新加载。所以看起来我只是第一次打开它或在浏览器中按 F5。“private void HandleValidSubmit()”中的代码不会命中。看起来我只是用 HTTP 发布了一个常规表单。但这是一个 SPA,我不需要它通过 HTTP 发布。带验证的 Blazor 表单的正确代码应该是什么?为什么在VS2019调试模式下可以工作?或者,最有可能的是,需要 IIS 设置?谢谢。

forms iis-7.5 blazor-server-side

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

一个 Blazor 项目能否同时包含 WebAssembly 部分和服务器端部分?

现在 Blazor WebAssembly 正式发布,我尝试使用该模板创建我的第一个 Blazor wasm 项目,但很快注意到一件事与我所期望的完全不同。模板中似乎没有“服务器”部分,发布的结果仅包含静态资产(包括所有 .dll 文件)。当然,我想知道如何访问我的在线数据库?允许客户端直接访问我的数据库听起来是一个糟糕的主意(如果它可以做到的话),因为我必须在我的客户端代码中的某处包含我的连接字符串......绝对不!

在谷歌上快速搜索后,似乎每个人都在使用另一台服务器使用 API 来提供数据。好的,很好,但是如果我可以将我的服务器部分包含在同一个项目中,并使用 WebSocket(就像在 Blazor 服务器中一样)而不是 API 与我的客户端进行通信,那不是更好吗?那可能吗?

blazor blazor-server-side blazor-client-side

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

Blazor WASM Asp.net core Hosted = Blazor 服务器端?

我在别处读到在创建 Blazor 服务器端应用程序时,每次您的应用程序用户与该应用程序交互时,服务器都会创建您的应用程序实例,这意味着,如果您有 1000 个用户同时使用您的应用程序,您的托管服务器将必须同时管理 1000 个应用实例。

因此,如果这是真的,Blazor WASM Asp.net Core 托管应用程序的 Asp.net 核心托管层是否也是这种情况?意思是,如果您有 1000 个用户同时向 WebAPI 发送请求,是否会创建 1000 个实例来处理请求?

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

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

在服务器端 Blazor 项目中构建身份时出错

我正在开发一个服务器端 Blazor 应用程序,该应用程序是使用为身份验证选择的“个人用户帐户”选项创建的。

我现在想自定义登录页面,但是当我选择通过脚手架添加身份页面时,我收到以下错误,我不知道从哪里开始进行故障排除。

无法在内存中编译项目

.OnInitializedAynsc() 找不到合适的方法来覆盖

为我的项目中的每个页面列出了上述错误。

在此处输入图片说明

asp.net-identity blazor blazor-server-side

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

Blazor 获取两个属性的验证消息

我在 Blazor 服务器端应用程序中有一个简单的 EditForm。它有一个绑定属性,它改变了另一个也应该由表单验证的属性。

表格包含以下部分

<div class="form-group col-md-6">
    <label for="inputRechnungsnummer">Rechnungsnummer</label>
    <InputNumber @bind-Value="Input.Rechnungsnummer" id="inputRechnungsnummer" class="form-control" />
    <ValidationMessage For="() => Input.CustomerExists" />
    <ValidationMessage For="() => Input.Rechnungsnummer" />
</div>
Run Code Online (Sandbox Code Playgroud)

如您所见,我想在这个 InputField 下显示两条消息。

bond 字段调用一个方法来查找客户详细信息。

public int Rechnungsnummer 
{ 
    get => _rechnungsnummer; 
    set
    {
        _rechnungsnummer = value;
        SearchKunde();
    }
}
Run Code Online (Sandbox Code Playgroud)

这个方法改变了我的属性值

private void SearchKunde()
{

    /* LOGIC */
    
    if(name != null)
    {
        Kundenname = name;
        CustomerExists = true;
    }
    else
    {
        Kundenname = "";
        CustomerExists = false;
    }
}
Run Code Online (Sandbox Code Playgroud)

第二个属性定义为:

[Required]
[Range(typeof(bool), "true", "true", …
Run Code Online (Sandbox Code Playgroud)

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

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

除 Body 之外的 Blazor 页面元素

我有一个 Blazor 服务器端应用程序,试图了解其结构。在 MainLayout.razor 页面中,我看到了标签 @Body,这是每个页面内容的呈现位置。

我想知道,是否可以向 mainLayout 页面添加额外的渲染元素?例如,@Header 部分。而且我更愿意在每个单独的页面中定义这个部分。

换句话说,对于每个页面,除了主要内容之外,还需要定义Header、Footer,或者我在MainLayout中定义的任何渲染元素。这样,我可以自定义每个页面唯一的页眉/页脚元素。

谢谢你的帮助。

blazor blazor-server-side

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

如何向 Blazor 组件添加 HTML 属性(类等)?

这似乎是一个非常基本的问题,但我还没有找到我正在寻找的答案。

假设您有一个名为 的 Blazor 组件<Button>,该组件具有诸如Label等参数。当您使用该组件时,这些参数的接收方式类似于 HTML 属性:

<Button Label="Sign Up" />
Run Code Online (Sandbox Code Playgroud)

但是如何为组件设置实际的 HTML 属性?!例如,假设您想为组件表示的元素提供额外的类,或标题属性、角色或类型等。以下显然不起作用,因为组件标记上的所有属性都是预期的成为该组件的参数:

<Button Label="Sign Up" class="foo" type="submit" id="bar" />
Run Code Online (Sandbox Code Playgroud)

因此,我能想到的唯一方法是为该组件内的每个属性声明一个参数(公共属性)。

<button type="@Type" class="button @Class" id="@Id">@Label</button>

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

    [Parameter]
    public string Type { get; set; }

    [Parameter]
    public string Role { get; set; }

    [Parameter]
    public string Id { get; set; }

    // And others
}
Run Code Online (Sandbox Code Playgroud)

然后在使用组件时你这样做:

<Button Label="Sign Up" Class="foo" Id="bar" Type="Submit" />
Run Code Online (Sandbox Code Playgroud)

但这显然并不理想。这不方便,而且看起来像是一个不必要的抽象层。

所以,我的问题是:这应该怎么做?如果有这样的事情,那么“标准”的方法是什么。难道没有比为每个属性声明参数更方便的方法吗?

我一般是 …

blazor blazor-server-side blazor-webassembly

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