我的公司正在从遗留代码库转向更现代的平台,我们正在转向 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 项目。项目划分如下:
一个例子可能是这样的:
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) 在 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 中使用普通的单页剃刀组件。我可以IJSRuntime在页面顶部像这样注入:
@inject IJSRuntime JSRuntime
Run Code Online (Sandbox Code Playgroud)
如果我为组件在 .razor.cs 文件后面创建了一个代码,我如何将类似的内容IJSRuntime注入到代码隐藏文件中?
我正在 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) 尝试使用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)
找不到与此错误相关的任何内容。我不知道在哪里搜索更多信息。
谢谢你的任何想法。
我的 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 是“实验性的”。感觉就像我正在努力改变这么简单的东西。
我创建了一个新的 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 文件?
我正在学习服务器端。西装外套。
我已经阅读了一些项目的代码,发现了一些使用:
@{
}
Run Code Online (Sandbox Code Playgroud)
和一些使用:
@code{
}
Run Code Online (Sandbox Code Playgroud)
和其他使用:
@function{
}
Run Code Online (Sandbox Code Playgroud)
标记代码块。
我想知道这些之间的区别。谢谢你。
在 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) 我正在尝试使用 Blazor WebAssembly 开发一个应用程序,我想知道如果用户未通过身份验证,我该如何保护我的整个应用程序。我将实施的行为是:
更好的
目前我已经实现了将[Authorize]属性应用于每个页面的这种行为,但我想集中它。
我已经在 Blazor 服务器端应用[Authorize]了_host.razor组件内部的属性实现了这个目标。
Blazor 客户端是否有解决方案?
blazor ×10
c# ×3
.net-core ×2
asp.net-core ×2
.net ×1
asp.net-mvc ×1
mvvm ×1
razor ×1
razor-pages ×1
routing ×1