标签: blazor

Blazor 项目结构/最佳实践

我的公司正在从遗留代码库转向更现代的平台,我们正在转向 Blazor。我们目前刚刚参与 ORM 和最佳实践,似乎有很多关于项目设置的相互矛盾的想法(至少从我收集到的内容来看)。我目前的结构如下:

首先是一个名为 DAL 的类库——这是我们的“数据层”。我们正在使用 Dapper,它相对简单。示例类如下所示:

public class Person
{
      public string Id {get; set;}
      public string FirstName {get; set;}
      public string LastName {get; set;}

      public Person() {}
      public Person(DbContext context) {}

      public void GetPerson(int id) {}
      public void DeletePerson(int id) {}


      etc....
}
Run Code Online (Sandbox Code Playgroud)

第二个项目是引用项目 DAL 的服务器 Blazor 项目。项目划分如下:

  1. 模型 - 这些是当前正在处理的项目的特定模型。例如,一个模型可能是多个表(来自 DAL 类的模型)的组合,或者只是用于网页表单的字段。

一个例子可能是这样的:

public class EmployeeModel
{
    public int Id {get; set;}
    public int Department{get; set;}
    public DateTime HireDate {get; set;}
    public decimal Salary {get; set;} …
Run Code Online (Sandbox Code Playgroud)

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

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

如何通过 Blazor WebAssembly 写入浏览器的控制台?

在 JavaScript 中,我们可以使用以下调用将调试输出写入浏览器的控制台:

console.log("My debug output.");
Run Code Online (Sandbox Code Playgroud)

谷歌浏览器中的输出:

谷歌浏览器中的控制台输出

如何通过 Blazor WebAssembly 将组件中的“我的调试输出”记录到浏览器的控制台?

<button @onclick="ClickEvent">OK</button>

@code {

    private void ClickEvent()
    {
        // console.log("My debug output.");
    }
}
Run Code Online (Sandbox Code Playgroud)

blazor blazor-client-side asp.net-blazor

20
推荐指数
4
解决办法
1万
查看次数

如何在 .razor.cs 文件后面注入 blazor 代码?以 IJSRuntime 为例

在 Blazor 中使用普通的单页剃刀组件。我可以IJSRuntime在页面顶部像这样注入:

@inject IJSRuntime JSRuntime
Run Code Online (Sandbox Code Playgroud)

如果我为组件在 .razor.cs 文件后面创建了一个代码,我如何将类似的内容IJSRuntime注入到代码隐藏文件中?

.net c# razor blazor blazor-server-side

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

Blazor Timer 调用异步 API 任务来更新 UI

我正在 Blazor 服务器端页面中设置计时器。目标是每 x 秒调用一次 API,并根据返回值更新 UI。

我得到这个代码:

private string Time { get; set; }

protected override void OnInitialized()
{
    var timer = new System.Threading.Timer((_) =>
    {
        Time = DateTime.Now.ToString();
        InvokeAsync(() =>
        {
            StateHasChanged();
        });
    }, null, 0, 1000);
    base.OnInitialized();
}
Run Code Online (Sandbox Code Playgroud)

这效果很好。UI 每秒更新一次新的时间值。但是,我不知道如何调用异步任务来获取值。我想更换线路:

Time = DateTime.Now.ToString();
Run Code Online (Sandbox Code Playgroud)

一行调用以下函数:

private async Task<string> GetValue()
{
    var result = await _api.GetAsync<StringDto>("/api/GetValue");
    return result.Text;
}
Run Code Online (Sandbox Code Playgroud)

我试过这条线:

Time = GetValue().Result;
Run Code Online (Sandbox Code Playgroud)

但我收到以下错误:

The current thread is not associated with the Dispatcher. Use InvokeAsync() to switch execution to …
Run Code Online (Sandbox Code Playgroud)

blazor blazor-server-side

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

没有可用于指定 RuntimeIdentifier 'browser-wasm' 的 Microsoft.AspNetCore.App 运行时包

尝试使用Microsoft 提供的本指南从 ASP.NET Core 3.1 迁移到 5.0 。

安装了带有运行时的 SDK 5.0.100-rc.1。按照指南更新项目,但仍然出现以下错误:

There was no runtime pack for Microsoft.AspNetCore.App available for the specified RuntimeIdentifier 'browser-wasm'
Run Code Online (Sandbox Code Playgroud)

项目文件:

<Project Sdk="Microsoft.NET.Sdk.BlazorWebAssembly">
    <PropertyGroup>
        <TargetFramework>net5.0</TargetFramework>
        <UserSecretsId>*****</UserSecretsId>
    </PropertyGroup>
...
Run Code Online (Sandbox Code Playgroud)

找不到与此错误相关的任何内容。我不知道在哪里搜索更多信息。

谢谢你的任何想法。

asp.net-core blazor blazor-client-side blazor-webassembly

19
推荐指数
5
解决办法
6270
查看次数

在 Blazor 中设置启动页面

我的 Blazor 应用程序中的启动页面是 Index.cshtml。我想将启动页面更改为主页,即我的 Home.cshtml。
我正在使用 vs2019,ASPNET CORE Blazor (0.9.0-preview3-19154-020)。

Blazor Serverside 在 Startup.cs 中有路由,我认为它是针对服务的,而不是针对页面的……并且保留为通过创建新的 Blazor 项目生成的。

app.UseMvc(routes =>
{
   routes.MapRoute(name: "default", template: "{controller}/{action}/{id?}");
});
Run Code Online (Sandbox Code Playgroud)

客户的启动具有(由新的 Blazor 项目生成):

public void ConfigureServices(IServiceCollection services)
{
}

 public void Configure(IComponentsApplicationBuilder app)
{
     app.AddComponent<App>("app");
}
Run Code Online (Sandbox Code Playgroud)

我是否需要以某种方式在客户端 startup.cs 中注册路由?

index.cshtml 只有一行代码:

@page "/"
Run Code Online (Sandbox Code Playgroud)

如何将我的“启动”页面从 Index.cshtml 更改为 Home.cshtml?

我看过很多地方,都知道 Blazor 是“实验性的”。感觉就像我正在努力改变这么简单的东西。

routing razor-pages blazor

18
推荐指数
3
解决办法
1万
查看次数

找不到 blazor.server.js 文件

我创建了一个新的 ASP.NET Core 3.0 Web 应用程序并选择了模型-视图-控制器选项。我想添加 Blazor 服务器端,所以我将以下内容添加到 Startup.cs 文件中。

services.AddServerSideBlazor(); 
endpoints.MapBlazorHub();
Run Code Online (Sandbox Code Playgroud)

并添加了脚本文件

<script src="_framework/blazor.server.js"></script>
Run Code Online (Sandbox Code Playgroud)

在我的布局文件中。

我创建了一个简单的组件来显示我在文本框中输入的内容,并将该组件添加到我的Index.cshtml视图中。它在 Visual Studio 中工作,但是当我将它推送到我的内部 2016 服务器时,该组件已呈现,但文本未显示。该应用程序似乎无法找到该blazor.server.js文件。

我是否缺少其他一些部署步骤来推送 JS 文件?

asp.net-mvc blazor asp.net-core-3.0

18
推荐指数
3
解决办法
7432
查看次数

Blazor 中的@{} @code{} 和@function{} 有什么区别?

我正在学习服务器端。西装外套。

我已经阅读了一些项目的代码,发现了一些使用:

@{
}
Run Code Online (Sandbox Code Playgroud)

和一些使用:

@code{
}
Run Code Online (Sandbox Code Playgroud)

和其他使用:

@function{
}
Run Code Online (Sandbox Code Playgroud)

标记代码块。

我想知道这些之间的区别。谢谢你。

.net-core asp.net-core blazor

18
推荐指数
2
解决办法
5723
查看次数

C# Blazor:如何在后面的代码中使用@typeparam?(有解决方法)

在 Blazor .razor文件中,您可以@typeparam MyType使用泛型参数。例如:

MyComponent.razor

@typeparam MyType

<SomeHtml />

@code
{
    [Parameter]
    public List<MyType> MyList{ get; set; }
}
Run Code Online (Sandbox Code Playgroud)

所以你可以调用:

<MyComponent MyType="MyTypeABC" MyList="@MyData.MyList" />
Run Code Online (Sandbox Code Playgroud)

但我更喜欢后面的代码(razor.cs),我如何使用像@typeparam MyTyperazor.cs 文件中的类型的参数?

我目前的解决方法是:

MyComponent.razor

@inherits MyComponentCode<MyType>
@typeparam MyType
Run Code Online (Sandbox Code Playgroud)

MyComponent.razor.cs

public class MyComponentCode<MyType> : ComponentBase
{
    [Parameter]
    public List<MyType> MyList{ get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我想念类似的东西[TypeParameter],但也许有更好的解决方案,有什么想法吗?或者也许这是一个关于“如何在后面的代码中使用剃刀@statements”的一般问题。


2020-02-27 更新:

根据Roger Wolf 的建议(见下文),一个更好的方法:

MyComponent.razor

@typeparam MyType
Run Code Online (Sandbox Code Playgroud)

MyComponent.razor.cs

public partial class MyComponent<MyType>
{
    [Parameter]
    public List<MyType> MyList{ …
Run Code Online (Sandbox Code Playgroud)

c# blazor

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

如果用户未通过身份验证,Blazor 重定向到登录

我正在尝试使用 Blazor WebAssembly 开发一个应用程序,我想知道如果用户未通过身份验证,我该如何保护我的整个应用程序。我将实施的行为是:

  • 如果匿名用户请求任何页面,那么他将被重定向到登录页面

更好的

  • 用户必须通过身份验证才能使用此应用程序

目前我已经实现了将[Authorize]属性应用于每个页面的这种行为,但我想集中它。

我已经在 Blazor 服务器端应用[Authorize]_host.razor组件内部的属性实现了这个目标。

Blazor 客户端是否有解决方案?

blazor blazor-client-side

18
推荐指数
4
解决办法
1万
查看次数