标签: blazor-server-side

如何在 Blazor 中调用子组件的方法

我有Foo.razor

@foreach (var item in items) {
  <p>@item</p>
}

@code {
  private List<string> items = new List<string>();

  public void Append(string item) => items.Add(item);
}
Run Code Online (Sandbox Code Playgroud)

如果我有Bar.razor

<Foo/>

@code {
  public void SomeMethod() {
    ...
  }
}
Run Code Online (Sandbox Code Playgroud)

我怎样才能Append("something")从打电话SomeMethod()

blazor blazor-server-side

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

使用路由时 Blazor 服务器错误 400 无法与服务器协商

Blazor 路由错误

描述错误

如所附屏幕截图所示,我正在使用路由:

@page“/addbrand/{BrandId:guid}”

当我刷新 url https://localhost:44379/addBrand/1abc52f3-c371-4566-847d-1a986f093396时,这会导致错误 400 无法加载资源,因为 balzor 协商的 url 更改为https://localhost:44379/addBrand /_blazor/negotiate?negotiateVersion=1 而不是 https://localhost:44379/_blazor/negotiate?negotiateVersion=1

https://localhost:44379/addBrand/_framework/blazor.server.js 而不是 https://localhost:44379/_framework/blazor.server.js

这发生在 _host.cshtml 文件中的所有链接上。

有例外吗?是的,浏览器控制台日志:[2020-03-23T21:57:35.846Z] 信息:将“_blazor”规范化为“ https://localhost:44379/addBrand/_blazor ”。_blazor/negotiate?negotiateVersion=1:1 无法加载资源:服务器响应状态为 400 () blazor.server.js:1 [2020-03-23T21:57:35.917Z] 错误:无法完成与服务器:错误

更多技术细节

  • ASP.NET核心版本:3.1
  • IDE:VS 2019

我已经在github上举报了

blazor blazor-server-side

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

在不使用路由参数的情况下将数据从一个 Razor 页面传递到另一个页面

我有一个页面add,它将向数据库添加一个项目OnValidSubmit,然后重定向到一个页面list。在页面上,list我想显示一条成功消息,如“添加项目”。

我只想显示一次成功消息“添加项目”。如果用户刷新页面,它将消失。因此,通过 传递的路由参数URL似乎是错误的,因为这将在刷新后继续存在。

那么,我如何一次性传递“显示成功消息”标志以及一些附加数据,例如项目名称?

提示:我正在使用 Blazor 服务器端

c# blazor blazor-server-side

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

数据库未使用代码优先方法在 blazor 中创建

我正在使用 blazor 并且我正在应用代码优先方法

但问题是我的数据库没有创建

我的项目的层次结构

首先我创建一个项目,然后选择一个Visual Studio 2019 -> blazor app -> blazor server app

然后

我在 appsetting.json 添加 connetionstring

{
  "ConnectionStrings": {
    "DefaultConnection": "Data Source=servername;Initial Catalog=databasename;User ID=userid;Password=password"
  },
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    }
  },
  "AllowedHosts": "*"
}
Run Code Online (Sandbox Code Playgroud)

然后

上面的连接字符串名称在 startup.cs 中初始化

 public void ConfigureServices(IServiceCollection services)
        {
            services.AddRazorPages();
            services.AddServerSideBlazor();
            services.AddDbContext<MyDbContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
        }
Run Code Online (Sandbox Code Playgroud)

然后我创建了一个 Emp 类

Emp.cs

namespace BlazorServerApp.Pages
{
    public class Emp:ComponentBase
    {
        public int empid { get; set; }
        public …
Run Code Online (Sandbox Code Playgroud)

c# blazor visual-studio-2019 blazor-server-side

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

Blazor 服务器应用程序在部署时无法工作,但在 Visual Studio 中工作正常

我有一个 Blazor 服务器端项目,我一直在 Visual Studio 2019 中使用 .NET5 开发该项目。一切都运转良好。

我刚刚将该站点部署到测试服务器(该服务器上已经运行了两个这样的站点,因此我知道该服务器拥有运行该站点所需的一切),但 Blazor 的东西似乎都不起作用。具体来说...

  • 单击按钮不会执行任何操作
  • 单击链接会刷新整个页面,而不仅仅是呈现新的 HTML
  • 授权似乎被忽略了,因此具有属性的页面[Authorize]对任何人都可见

不知道要显示什么代码,因为它在 VS 中运行时都有效。App.razor以下是...的内容

<CascadingAuthenticationState>
  <Router AppAssembly="@typeof(Program).Assembly">
    <Found Context="routeData">
      <AuthorizeRouteView RouteData="@routeData" DefaultLayout="@typeof(MainLayout)">
        <NotAuthorized>
          <RedirectToLogin />
        </NotAuthorized>
      </AuthorizeRouteView>
    </Found>
    <NotFound>
      <AuthorizeView>
        <Authorized>
          <LayoutView Layout="@typeof(MainLayout)">
            <NotFound />
          </LayoutView>
        </Authorized>
        <NotAuthorized>
          <RedirectToLogin />
        </NotAuthorized>
      </AuthorizeView>
    </NotFound>
  </Router>
</CascadingAuthenticationState>
Run Code Online (Sandbox Code Playgroud)

_Imports.razor文件包含所有正确的using内容,特别包括...

@using Microsoft.AspNetCore.Authorization
@using Microsoft.AspNetCore.Components.Authorization
@using Microsoft.AspNetCore.Components.Forms
@using Microsoft.AspNetCore.Components.Routing
@using Microsoft.AspNetCore.Components.Web
Run Code Online (Sandbox Code Playgroud)

非登录用户不应访问的页面[Authorize(Roles = "Admin")]在代码隐藏或@attribute [Authorize(Roles = "Admin")]文件中用 进行修饰 …

blazor blazor-server-side

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

异步方法:在上一个操作完成之前在此上下文上启动第二个操作

我是 Blazor 的新手,没有太多使用任务的经验,所以希望我只是犯了一个愚蠢的错误。我有一个通过按下按钮调用的异步方法,但如果在 1-2 秒内再次调用该方法,我会收到以下异常。

Error: System.InvalidOperationException: A second operation was started on this context before a previous operation completed. This is usually caused by different threads concurrently using the same instance of DbContext. For more information on how to avoid threading issues with DbContext, see https://go.microsoft.com/fwlink/?linkid=2097913.
Run Code Online (Sandbox Code Playgroud)

此按钮针对“用户”表中的每一行呈现。我试图快速连续删除多个用户记录,但收到上述错误。

这是按下按钮的代码(使用 AntBlazor)

 <Button Type="primary" Danger OnClick="@(async() => await RemoveAsync(user))">Remove User</Button>
Run Code Online (Sandbox Code Playgroud)

这是RemoveAsync 方法的代码。

private async Task RemoveAsync(User user)
{
   await UserService.UpdateUserAsync(user);
}
Run Code Online (Sandbox Code Playgroud)

我是否误解了 async/await 的工作原理?或者我是否需要利用任务来确保操作完成?

编辑:

这是 UserService.UpdateUserAsync() 代码

public async Task<bool> UpdateUserAsync(User …
Run Code Online (Sandbox Code Playgroud)

.net c# blazor blazor-server-side

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

Blazor Server 使用计时器定期更新图像

抱歉问了这个基本问题。

图像将粘贴并显示在使用 Blazor Server 创建的网页上。

我想定期更新此显示的图像。(例如每秒更新一次)

该图像存储在 wwwroot / imageFiles 位置,名称为 PreviewImage.bmp。

具体来说,我想在替换这个wwwroot/imageFiles下的PreviewImage.bmp时,将网页上显示的图像切换为替换后的图像。

例如,当我将显示狗的 PreviewImage.bmp 更改为显示猫的 PreviewImage.bmp 时,我想切换网页上显示的图像。

我想知道是否可以使用 StateHasChanged () 更新图像;用计时器,但这不起作用。

<img src="@previewImg" />

@code{
    
    private string previewImg = string.Empty;
    private Timer timer = new(1000);

    protected override void OnInitialized()
    {
        previewImg = @"imageFiles/PreviewImage.bmp";

        timer.Elapsed += (sender, eventArgs) => OnTimerCallback();
        timer.AutoReset = true;
        timer.Start();            
    }

    private void OnTimerCallback()
    {    
        _ = InvokeAsync(() =>
       {    
         previewImg = @"imageFiles/PreviewImage.bmp";
         StateHasChanged();
       });
    }
 }
Run Code Online (Sandbox Code Playgroud)

但是,如果您使用 F5 键重新加载整个页面,图像将会更新。

有没有办法实现这种图像更新?

很抱歉,内容很难理解。

感谢您的建议。

blazor blazor-server-side

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

在 blazor 服务器应用程序中,我在哪里存储重要的 api 密钥?

我有一个 blazor 服务器应用程序,我需要知道在这里为我的应用程序存储一些重要信息,在 appsettings.json 中,一个 .resx 文件?或者别的地方?

c# blazor blazor-server-side

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

异步或非异步方法

我正在编写 blazor 服务器 Web 应用程序。

该应用程序与数据库和实体框架配合使用。

这是我写的一个方法:

private void MyMethod()
{
    var query = mydbcontext.mytable1.Where(t => ...);
    foreach (var item in query)
    {
       ...
    }
}
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,该方法没有用“异步任务”声明。因此,她将在没有“await”关键字的情况下被调用。

我可以用“异步任务”声明它并用“等待”调用它。它有效,但它给了我一个警告,因为我里面没有异步调用。

假设我决定不使用“异步任务”声明它以避免警告。

如果我稍后需要更改函数中需要异步调用的某些内容(例如这个),会发生什么:

private async Task MyMethod()
{
    var query = mydbcontext.mytable1.Where(t => ...);
    foreach (var item in query)
    {
       ...
    }
    var countresult = await query.CountAsync();
}
Run Code Online (Sandbox Code Playgroud)

我需要搜索 MyMethod 的所有调用,并在每个调用上添加“await”。

为了防止这种情况,我想知道是否不应该使用“异步任务”声明所有方法。但这很丑陋,因为我会收到警告。

最佳做法是什么?

有没有办法以 ASync 的方式执行此循环?

private async Task MyMethod()
{
    var query = mydbcontext.mytable1.Where(t => ...);
    await foreachAsync (var item in query) …
Run Code Online (Sandbox Code Playgroud)

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

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

MarkupString 无法按预期与 Blazor 中的 String.Format 配合使用

我正在尝试将字符串格式应用于来自资源文件的字符串。

<p class="note">@((MarkupString)(String.Format(Localizer["Test"], 2)))</p>
Run Code Online (Sandbox Code Playgroud)

但这是它在浏览器中的显示方式:

You have done <span class="text-primary text-bold"> 2 </span> tests.
Run Code Online (Sandbox Code Playgroud)

我应该怎么做才能让它采取正确的造型?

我已经尝试过这个解决方案,但它说:

The type or namespace name 'HtmlSanitizer' could not be found 
Run Code Online (Sandbox Code Playgroud)

我正在使用 Blazor 服务器和 .NET6

编辑:我有一个名为 App.resx 的文件

<data name="Test" xml:space="preserve">
    <value>
      You have done 
      &amp;lt;span class="text-primary text-bold"&amp;gt; 
        {0}
      &amp;lt;/span&amp;gt;
      tests.
    </value>   
</data>
Run Code Online (Sandbox Code Playgroud)

c# blazor blazor-server-side .net-6.0

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

C# 尝试将 Task&lt;List&lt;myObj&gt;&gt; 转换为 List&lt;myObj&gt; 时出错

我在使用异步方法时遇到一些问题。我对它有点陌生,但我正在编写一些 Blazor 代码并使用 Blob 存储,并且一些调用需要异步。这是我的代码和问题。此代码需要异步,因为它从 Azure 获取 Blob 数据。(FileUpload 是我的自定义对象):

        public async Task<List<FileUpload>> GetAllFilesAsync()
        {

            // TODO: GENERATE fileupload objects here and return
            await foreach (var blobItem in _container.GetBlobsAsync())
            {
                var name = blobItem.Name;
                BlobClient blobClient = _container.GetBlobClient(name);

                FileUpload fileUploadViewModel = new FileUpload()
                {
                    FileName = blobItem.Name,
                    FileStorageUrl = blobClient.Uri.ToString(),
                    ContentType = blobItem.Properties.ContentType,
                };

                _allFiles.Add(fileUploadViewModel);

            }
            return _allFiles;
        }
Run Code Online (Sandbox Code Playgroud)

在我的 Blazor 代码(服务器)中,我有以下代码在初始化时调用服务:

        private List<FileUpload> fileUploadViewModels = new();

        protected override async Task OnInitializedAsync()
        {
            GetAllBlobsAsync();
        }


        private void GetAllBlobsAsync()
        {
            var …
Run Code Online (Sandbox Code Playgroud)

.net c# task async-await blazor-server-side

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