我创建了一个默认的 Blazor 项目,并希望在同一项目中拥有一个 Web API 部分以用于原型设计。
因此,我将所有控制器和相关内容放在一个Api子文件夹中,并将 Blazor 内容放在一个Blazor子文件夹中。
项目结构:
- Api
- Controllers
- AController.cs
- Blazor
- Pages
- _Host.cshtml
- Counter.razor
- Error.razor
- FetchData.razor
- Index.razor
- Data
- WeatherForecast.cs
- WeatherForecastService.cs
- Shared
- MainLayout.razor
- NavMenu.razor
- _Imports.razor
- App.razor
- appsettings.json
- appsettings.Development.json
- Program.cs
- Startup.cs
Run Code Online (Sandbox Code Playgroud)
Startup.cs
public class Startup
{
public IConfiguration Configuration { get; }
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public void ConfigureServices(IServiceCollection …Run Code Online (Sandbox Code Playgroud) 为了演示目的,假设我有一个名为 StateManager 的类:
public class StateManager
{
public StateManager()
{
IsRunning = false;
}
public void Initialize()
{
Id = Guid.NewGuid().ToString();
IsRunning = true;
KeepSession();
}
public void Dispose()
{
Id = null;
IsRunning = false;
}
public string Id { get; private set; }
public bool IsRunning { get; private set; }
private async void KeepSession()
{
while(IsRunning)
{
Console.WriteLine($"{Id} checking in...");
await Task.Delay(5000);
}
}
}
Run Code Online (Sandbox Code Playgroud)
它有一个在启动后运行的方法,每 5 秒将其 Id 写入控制台。
在我的 Startup 类中,我将其添加为范围服务:
services.AddScoped<StateManager>();
Run Code Online (Sandbox Code Playgroud)
也许我使用了错误的位置,但在我的MainLayout.razor文件中,我在OnInitializedAsync() …
我有一个服务器端 Blazor 应用程序。每个用户想要访问某个页面时都必须经过身份验证。为此,用户被重定向到“身份服务器”登录页面。当用户使用正确的凭据登录时,他会被重定向回 Blazor 应用程序。
我已使用 设置我的 Blazor 应用程序CascadingAuthenticationState,以便我可以User在 Blazor 页面内访问该对象及其声明。
组件内部是这样的:
[CascadingParameter]
private Task<AuthenticationState> AuthenticationStateTask { get; set; }
...
...
var authState = await AuthenticationStateTask;
var claims = authState.User.Claims; // Works fine.
Run Code Online (Sandbox Code Playgroud)
当我这样做时,我可以访问用户的声明。
到目前为止,一切都很好。
但我还有一个中间件类,我需要在其中访问用户声明。
public async Task InvokeAsync(HttpContext context)
{
if (context?.User?.Claims != null && context.User.Claims.Any())
{
Console.WriteLine("aaa");
}
// Call the next delegate/middleware in the pipeline
await _next(context);
}
Run Code Online (Sandbox Code Playgroud)
但由于某种原因,这些User主张总是空洞的。
为什么User.ClaimsBlazor 组件内部的对象填充了所有声明,但当我通过对象访问它们时它们是空的HttpContext?
asp.net-identity .net-core blazor blazor-server-side .net-core-3.1
使用 swagger,您可以根据注释自动创建 API 方法的文档。
除了 Blazor 组件之外,是否可以执行相同的操作?
c# blazor blazor-server-side blazor-client-side asp.net-blazor
我继承了一个用 Blazor 和 .NET Core 3.1 编写的网站,我需要向用户提供一个“注销”按钮。该网站使用 的自定义实现AuthenticationStateProvider,方法如下GetAuthenticationStateAsync():
public override async Task<AuthenticationState> GetAuthenticationStateAsync()
{
ClaimsIdentity identity = new ClaimsIdentity();
if (_currentUser != null)
{
identity = GenerateClaimsForCurrentUser();
}
else
{
try
{
var user = await sessionStorage.GetItemAsync<Credentials>("User");
if (user != null && await IsAuthentic(user))
{
_currentUser = await UserInfo(user);
identity = GenerateClaimsForCurrentUser();
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
return new AuthenticationState(new ClaimsPrincipal(identity));
}
Run Code Online (Sandbox Code Playgroud)
要验证用户是否已登录,代码为:
AuthenticationState authState = await authenticationState.GetAuthenticationStateAsync();
ClaimsPrincipal principal = authState.User; …Run Code Online (Sandbox Code Playgroud) 当涉及 ASP.NET Core 时,我遇到了一种我不理解的行为。
在使用控制台应用程序以读取配置文件时,我通过以下方式将其复制到输出目录:
<ItemGroup>
<Content Include="mysettings.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
</ItemGroup>
Run Code Online (Sandbox Code Playgroud)
FileNotFoundException否则,如果我只使用文件名而不是完整路径,我就会得到。这样我就可以从其他项目导入文件(例如另一个设置 jsons)并且工作正常。
到目前为止,一切都很好。
但是,在 ASP.NET Core 中(更具体地说,我使用 ASP.NET Core 后端处理 Blazor Web Assembly 项目),当我运行服务器项目时,不会从输出目录中读取设置,而是从项目目录中读取设置。因此,我在尝试从解决方案中的另一个项目读取设置文件时遇到错误,因为应用程序在项目文件夹而不是输出文件夹中查找它。
我不确定它是否相关,但Directory.GetCurrentDirectory()显示/BlazorApp/Server了我宁愿期待的/BlazorApp/Server/bin/Debug/netcoreapp3.1。
这是 ASP.NET Core 中的预期行为吗?如果是这样,我如何使用其他项目的文件?我想避免手动更新多个位置的设置。
提前致谢
我有一个输入元素。keydown我在使用 JavaScript和事件输入时添加了一些过滤和修改文本的功能keypress。
例如 - 当输入接受大写字符时,当您仅按“a”(无shift,无大写锁定)时,您会得到“A”。
这是可行的,但是输入值绑定根本不起作用。我只是调用preventDefault()JS 事件,就这样,绑定被破坏了。
我尝试自己调度该事件。我发送了新创建的KeyboardEvent并且CustomEvent类型为“change”的。什么都不起作用。我可以修改 JS 事件处理程序中的输入值,我可以在浏览器中看到更改,但我的 C# 却看不到。
我怎样才能做到这一点?我是否必须手动调用 C# 来更新绑定,还是有其他方法?
该代码应仅在最新的 Chrome / Firefox 浏览器上运行,较旧的浏览器可能不受支持。
我正在使用BlazorInputFileBlazor 中的包上传文件。
问题
这段代码不起作用。
<InputFile OnChange="OnFileUpload" accept="image/x-png,image/jpeg" title="Upload jpeg or png image" />
Run Code Online (Sandbox Code Playgroud)
如何限制用户在 Blazor 中只能上传 jpeg 或 png?如果需要更多内容来支持该问题,请告诉我。
我有一个剃刀页面,如下所示。它继承了 PaymentBase 类,该类具有代码背后的代码。
@page "/payment"
@inherits PaymentBase
<h1>Payments</h1>
<button class="btn btn-primary" onclick="@GetList()">List all payments</button>
Run Code Online (Sandbox Code Playgroud)
一旦页面呈现,而不是在点击事件上,该GetList函数就会自动触发。请帮忙?
我的 blazor 服务器端组件有一个简单的输入模型。我想对 DateTime 属性使用内置验证。
[Required]
public DateTime Date { get; set; }
Run Code Online (Sandbox Code Playgroud)
我如何才能只接受 DateTime 值 >= DateTime.Now?