Razor 如何确定RenderFragment是否包含内容

Razor 如何确定RenderFragment是否包含内容,razor,blazor,blazor-server-side,razor-components,Razor,Blazor,Blazor Server Side,Razor Components,我刚刚构建了一个非常简单的razor组件,用于模板化页眉。现在我注意到我关于ChildComponent的情况!=null总是真的。有没有办法检查ChildContent是否定义了任何真实的内容 在我的示例中,PageTitleSecondaryRow将始终呈现到我的页面中,即使ChildContent为空(但它不是NULL)。我有哪些选择。作为一种解决方法,我现在将创建一个自定义RenderFragment属性,该属性在初始化时为null。但我不认为这是最终的解决办法 <div clas

我刚刚构建了一个非常简单的razor组件,用于模板化页眉。现在我注意到我关于ChildComponent的情况!=null总是真的。有没有办法检查ChildContent是否定义了任何真实的内容

在我的示例中,PageTitleSecondaryRow将始终呈现到我的页面中,即使ChildContent为空(但它不是NULL)。我有哪些选择。作为一种解决方法,我现在将创建一个自定义RenderFragment属性,该属性在初始化时为null。但我不认为这是最终的解决办法

<div class="wrapper border-bottom white-bg page-heading">
    <div class="row" id="PageTitlePrimaryRow">

        <div id="PageTitleIconColumn">
            @(IconMarkup())
        </div>
        <div  id="PageTitleTextColumn">
            <h2>
                @Title
            </h2>
            @if (Elements != null && Elements.Count > 0)
            {
                <TitleBreadcrumbs Elements="@Elements" />
            }
        </div>
        <div  id="PageTitlePostColumn">
        </div>
    </div>
    @if (ChildContent != null )
    {
        <hr />
        <div id="PageTitleSecondaryRow">
            @ChildContent
        </div>
    }
</div>

@(IconMarkup())
@头衔
@if(Elements!=null&&Elements.Count>0)
{
}
@if(ChildContent!=null)
{

@儿童内容 }
正如彼得·莫里斯(Peter Morris)所说,ChildContent只有在使用自动关闭语法时才为空。这是因为这是任何内容被分配到的默认呈现片段,即使它是空内容

建议为您的
渲染片段使用不同的名称。这样,如果它为null,您就知道它没有被显式设置。另一个好处是更准确地传达渲染片段的内容

假设您有以下组件
MyComponent.razor

@if (ListItems != null) 
{
    <ul>
        <li> default item </li>
        @ListItems
    </ul>
}
else 
{
    <p>alternative content</p>
}

@code {
    [Parameter]
    public RenderFragment ListItems { get; set; }
}
@if(ListItems!=null)
{
  • 默认项
  • @列表项
} 其他的 { 替代内容

} @代码{ [参数] 公共呈现片段列表项{get;set;} }
通过使用不同的RenderFragment名称,您必须在使用此组件时明确设置它。这捕获了ChildContent可能导致空html的意外情况:

@* displays only the alternative content *@
<MyComponent></MyComponent>

@* displays the ul element *@
<MyComponent>
    <ListItems>
        <li> other item </li>
    </ListItems>
</MyComponent>
@*仅显示备选内容*@
@*显示ul元素*@
  • 其他项目

  • 基本上是一样的,只是参数的名称不同。这可以防止Blazor在不使用自动关闭语法的情况下,假设打开和关闭之间的任何内容都属于ChildContent。

    只有在使用自动关闭语法时,名为ChildContent的渲染片段才会为空。谢谢你,彼得·莫里斯。这就解释了为什么有时候空检查的行为与我所希望的一样。有没有办法访问RenderFragment的一些内部信息。我唯一需要知道的是,ChildContent对象中嵌套了任何组件或元素。我的问题是组件中的ChildContent是从父组件传递的。因此,在父级中从来没有自动关闭语法,因为它被视为简单的占位符。您可以改为将名称更改为ChildContent以外的其他名称,然后组件的使用者将需要显式地包含属性的名称,例如,这样可以很容易地检查是否添加了属性(它将不为null)