【问题标题】:C# Blazor Error BL0005 - Setting Component Properties ProperlyC# Blazor 错误 BL0005 - 正确设置组件属性
【发布时间】:2020-07-02 18:36:02
【问题描述】:

我已经对此错误进行了研究,只是不了解正确的解决方案。

示例代码(直接取自供应商示例)
https://blazor.syncfusion.com/documentation/menu-bar/getting-started/

<SfMenu Items="@MenuItems"></SfMenu>

@code {
    public List<MenuItem> MenuItems = new List<MenuItem>{
        new MenuItem{ Text = "File", Items = new List<MenuItem>{
            new MenuItem{ Text= "Open" },
            new MenuItem{ Text= "Save" },
            new MenuItem{ Text= "Exit" }}
    },
        new MenuItem{ Text = "Edit", Items = new List<MenuItem>{
            new MenuItem{ Text= "Cut" },
            new MenuItem{ Text= "Copy" },
            new MenuItem{ Text= "Paste" }}
    },
        new MenuItem{ Text = "View", Items = new List<MenuItem>{
            new MenuItem{ Text = "Toolbars" },
            new MenuItem{ Text = "Zoom" },
            new MenuItem{ Text = "Full Screen" }}
    },
        new MenuItem{ Text = "Tools", Items = new List<MenuItem>{
            new MenuItem{ Text= "Spelling & Grammar" },
            new MenuItem{ Text= "Customize" },
            new MenuItem{ Text= "Options" }}
    },
        new MenuItem{ Text = "Go" },
        new MenuItem{ Text = "Help" }
    };
}

这将生成 BL0005 组件参数“文本”不应设置在其组件之外。它将使用所有参数执行此操作。

这是设置要传递给子组件的变量的代码。我看不到其他设置方法。组件没有提供单独的设置器。我真的不明白 VS 团队希望我如何构建和传递这些数据(如果他们的代码编译时出现相同的警告,供应商显然也不会这样做)。

谁能提供一个具体的例子来说明如何做到这一点?
我已经阅读了Correct way to mutate a component property in blazor,但在这种情况下我显然无法修改子组件,因为它是第三方库。

【问题讨论】:

  • 我想知道为什么这个菜单是用 C# 构建的。似乎在 Blazor/Html 中定义它的工作量大致相同,并且可以防止 htis 错误。
  • 如果它是静态定义的,我会同意。这是他们的示例代码,目前类似于我在我的应用程序中所做的。当然有一些动态元素会根据配置/用户/安全/等添加到菜单中,更有可能是从数据服务返回的项目的 List 反映要显示的项目,因此以一种或另一种方式,可能是动态构建的数组。完全在内联 Blazor 中执行此操作充其量是乏味的。

标签: c# visual-studio-2019 blazor


【解决方案1】:

用 [Parameter] 修饰的属性不应该通过代码设置,因为 OnParametersSet 生命周期方法不会被调用,因此它们只能由 razor 标记中的父组件设置。

在您的情况下,因为值不会改变,所以应该可以忽略这些警告。如果您在代码隐藏文件 (MyComponent.razor.cs) 中创建菜单项,您可以这样做

public partial class MyComponent
{
  protected override void OnInitialized() 
  {
#pragma warning disable BL0005
    // create the menu structure here
#pragma warning restore BL0005
  } 
} 

【讨论】:

  • 谢谢。这些选项总体上是动态的,但对于特定的页面生命周期是静态的(用户或页面调用之间可能会有所不同,但一旦用户使用它,我就不会更改它)。我将使用编译指示绕过警告。
猜你喜欢
  • 2020-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-18
  • 1970-01-01
  • 2020-05-11
相关资源
最近更新 更多