我正在寻找有关 automapper 中的 CreateMap/CreateProjection 和 ProjectTo/MapTo 之间关系的差异的解释。我刚刚开始使用这个库,我很难理解何时使用什么。我部分理解 ProjectTo 与 LINQ 有一些关系并且可以用于整个集合?我希望在 Blazor 服务器端项目中使用此库。
当我使用 EF Core 时,我也在研究这两个库:
但由于我是图书馆的新手,我认为在继续之前先从基础开始是个好主意。
c# mapping automapper entity-framework-core blazor-server-side
我正在探索 .NET 8 的新 Blazor 功能,但遇到了一个问题:我的组件似乎渲染了两次。当我将“流渲染”与“交互式服务器渲染模式”结合使用时,会出现此问题。
为了清楚起见,我简化了我的代码:
@attribute [StreamRendering]
@rendermode InteractiveServer
@if (data == null)
{
<p>Loading...</p>
}
else
{
<p>@data</p>
}
@code {
private string? data;
protected override async Task OnInitializedAsync()
{
await Task.Delay(1000);
data = "Hello World!";
}
}
Run Code Online (Sandbox Code Playgroud)
在此代码中,我希望首先显示“Loading...”文本,然后在延迟后显示文本“Hello World!” 应该更换它。这是可行的,但是一旦data显示,组件就会重新渲染并且加载文本会再次显示。
我的问题是:
最近在创建 blazor 组件时,我遇到了某些问题。
创建组件的最佳方法是什么(本机和或使用现有的 JavaScript UI)
选择 Existing JavaScript 时是否存在性能或内存泄漏。
使用 JavaScript Lib 组件时对服务端 blazor 的任何影响。
两种方法的优缺点是什么?
我有一个Visual Studio Enterprise 2017版本15.9.7和.Net core 2.2和.Net SDK 2.2.1。我试图blazor按照此链接创建一个Web应用程序。在本文中,它显示了Blazor类型的模板。但是我的视觉工作室没有得到相同的模板。
在进一步调查中,我找到了此链接,但前提条件包括Visual Studio 2019预览版和SDK 3.0预览版。当版本仍处于预览状态时,我不想立即跳转到它们。
因此,没有办法在当前配置中获取模板吗?有什么解决办法吗?
这是完全相同的问题,但是标记的解决方案在我的情况下不起作用。
编辑1:我尝试安装blazor扩展程序,但它说此扩展程序不能安装在任何当前安装的产品上(在我的情况下是VS 2017)。
编辑2:我尝试使用CLI创建项目,但以错误结束
错误NU1202:软件包Microsoft.AspNetCore.Blazor.Cli 0.9.0-preview3-19154-02与netcoreapp2.2(.NETCoreApp,Version = v2.2)不兼容。软件包Microsoft.AspNetCore.Blazor.Cli 0.9.0-preview3-19154-02支持:netcoreapp3.0(.NETCoreApp,Version = v3.0)
引用此VisualStudioMagazine文章,我试图将代码放在单独的文件中,而不是剃刀视图中。
我试过了:
@page "/Item"
@using WebApplication1.Shared
@using WebApplication1.Client.Services;
@inject HttpClient Http
@inherits ItemComponent
@if (ItemList != null)
{
<table class="table">
<thead>
<tr>
<th>ID</th>
<th>Name</th>
<th>Category</th>
<th>Metal</th>
<th>Price</th>
<th>Quantity</th>
</tr>
</thead>
<tbody>
@foreach (var item in ItemList)
{
<tr>
<td>@item.ID</td>
<td>@item.Name</td>
<td>@item.Category</td>
<td>@item.Metal</td>
<td>@item.Price</td>
<td>@item.Quantity</td>
</tr>
}
</tbody>
</table>
}
@functions{
public ItemModel[] ItemList;
ItemComponent IC = new ItemComponent();
protected override async Task OnInitAsync()
{
ItemList = IC.GetItems().Result;
//ItemList = await Http.GetJsonAsync<ItemModel[]>("api/Item/GetItems");
StateHasChanged();
}
}
Run Code Online (Sandbox Code Playgroud)
和ItemComponent:
using System.Threading.Tasks;
using …Run Code Online (Sandbox Code Playgroud) 我正在尝试在blazor服务器端应用程序中更改用于标题的字符串。但是我无法更新用户界面。
我尝试使用StateHasChanged(),但是没有用,所以我环顾四周,发现在制作的FlightFinder演示中,它具有OnChange事件Action,因此我正在尝试实现它。
它一直有效,直到我尝试刷新浏览器,然后我被这个错误击中
System.InvalidOperationException:'当前线程未与渲染器的同步上下文关联。在触发渲染或修改渲染过程中访问的任何状态时,请使用Invoke()或InvokeAsync()将执行切换到渲染器的同步上下文。
这就是我所拥有的:
private string _title = "TestSite";
public string Title => _title;
public event Action OnChange;
public void ChangePage(string pageName)
{
_title = pageName;
NotifyStateChanged();
}
private void NotifyStateChanged(int navigationType = 0)
{
OnChange?.Invoke();
}
Run Code Online (Sandbox Code Playgroud)
我所要做的就是调用ChangePage(“ some Page Title”),它可以工作,除非像我提到的那样,我尝试刷新。
我只是想通过另一个组件更改一个组件上的字符串,这听起来并不那么疯狂。如果有更好的方法来制作标题或更改其他组件中的内容,我很想听听。
那么,我该怎么做才能确保m调用方法在正确的线程上?还是有其他更有效的更改标题的方法?
先感谢您!
我希望能够使用Blazor渲染表单(服务器端渲染)
我在那里尝试了大多数教程,但看不到我在做什么错。我已将.net core更新为最新版本的SDK 3.0.100-preview6-012264
<EditForm Model="@Model" OnValidSubmit="@SubmitValidForm">
<FluentValidationValidator />
<ValidationSummary />
<p class="name">
Name: <InputText bind-Value="@Model.Name" placeholder="Name"/>
</p>
<button type="submit">Submit</button>
</EditForm>
@code {
Person Model = new Person();
void SubmitValidForm()
{
Console.WriteLine("OnValidSubmit");
}
}
Run Code Online (Sandbox Code Playgroud)
和
public class Person : ComponentBase
{
[Required(ErrorMessage = "Enter a name")]
[StringLength(10, ErrorMessage = "That name is too long")]
public string Name { get; set; } = "asd";
[Range(0, 200, ErrorMessage = "Nobody is that old")]
public int AgeInYears { get; set; }
[Required]
[Range(typeof(bool), …Run Code Online (Sandbox Code Playgroud) 我有一个服务器端 blazor 应用程序,我需要知道它的基本网址(例如https://localhost:1234或https://my-host.com/appname)。
在传统的ASP.NET Web应用程序,我可以检查Request控制器的性能以及从中检索信息(有Scheme,Host以及PathBase为该)。但由于这是一个服务器端运行的 Blazor 应用程序,因此没有Request对象(至少在我的理解中,除非在服务Index.cshtml.
我如何才能知道我的应用程序已部署到哪个 URL 并在哪个 URL 上运行?
理想情况下,我在启动时就已经有了这些信息,以便我可以相应地配置我的服务。
我想显示当前登录用户的电子邮件地址。但我不知道,如何得到它。我搜索了很多小时,但一无所获。我找到了一些片段来获取名称,但没有片段可以获取其他字段,例如电子邮件或电话号码。此代码段中的用户没有从数据库中获取它的 ID。
@page "/"
@inject AuthenticationStateProvider AuthenticationStateProvider
<button @onclick="@LogUsername">Write user info to console</button>
<br />
<br />
@Message
@code {
string Message = "";
private async Task LogUsername()
{
var authState = await AuthenticationStateProvider.GetAuthenticationStateAsync();
var user = authState.User;
if (user.Identity.IsAuthenticated)
{
Message = ($"{user.Identity.Name} is authenticated.");
}
else
{
Message = ("The user is NOT authenticated.");
}
}
}
Run Code Online (Sandbox Code Playgroud) 因此,随着发布了asp.net core 3.0和blazor 1.0,我开始使用blazor做一些实际的工作。将Blazor组件代码拆分为背后的代码时,我正在使用以下代码
public class LogoutModel : BlazorComponent
{
}
Run Code Online (Sandbox Code Playgroud)
不幸的是BlazorComponent不再存在,所以我转到ComponentBase。不确定此更改何时发生..
现在我的其余代码看起来像这样
public class LogoutModel : ComponentBase
{
protected override async Task OnInitializedAsync()
{
}
protected override async Task OnParametersSetAsync()
{
}
}
Run Code Online (Sandbox Code Playgroud)
我注意到的是,生命周期方法按以下顺序执行:OnInitializedAsync()OnParametersSetAsync()OnInitializedAsync()OnParametersSetAsync()
我不太确定为什么每个方法都要执行两次。
这就是我的Blazor文件的样子
@page "/account/logout"
@inherits LogoutModel
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width" />
<title></title>
</head>
<body>
Logout page
</body>
</html>
Run Code Online (Sandbox Code Playgroud)