.net core 制作自定义Blazor组件

.net core 制作自定义Blazor组件,.net-core,components,blazor,webassembly,blazor-webassembly,.net Core,Components,Blazor,Webassembly,Blazor Webassembly,我从Blazor的乐趣开始, 我要做的第一件事是将菜单项包装为自定义组件,以使导航更具可读性 我尝试了一些类似的方法: 文件:Components\MenuItem.razor @正文 @代码{ 公共字符串链接{get;set;} 公共字符串文本{get;set;} 公共字符串角色{get;set;} } 但是,如果在导航中使用组件而不是相同的内容,则在运行应用程序时不会加载任何内容 在我的导航菜单中,添加以下内容 停止加载页面(我没有看到任何错误) 但是navmenu中的以下命令直

我从Blazor的乐趣开始, 我要做的第一件事是将菜单项包装为自定义组件,以使导航更具可读性

我尝试了一些类似的方法:

文件:Components\MenuItem.razor


  • @正文
  • @代码{ 公共字符串链接{get;set;} 公共字符串文本{get;set;} 公共字符串角色{get;set;} }
    但是,如果在导航中使用组件而不是相同的内容,则在运行应用程序时不会加载任何内容

    在我的导航菜单中,添加以下内容

    
    
    停止加载页面(我没有看到任何错误) 但是navmenu中的以下命令直接起作用

    
    
  • 批准用户请求
  • 更新, 问题是我错过了[参数]装饰,在那之后它就起作用了

    最后的组件代码如下所示

    
    
  • @正文
  • @代码{ [参数] 公共字符串链接{get;set;} [参数] 公共字符串文本{get;set;} [参数] 公共字符串角色{get;set;} [参数] 公共字符串{get;set;} }
    作为参考,身份验证模块是由另一个程序员实现的,并且工作:),其配置如下

    builder.Services
    .AddOidcAuthentication(选项=>
    {
    builder.Configuration.Bind(“oidc”,options.ProviderOptions);
    options.UserOptions.RoleClaim=“角色”;
    options.authenticationPath.LogInFailedPath=“/”;
    options.authenticationpath.LogOutSucceededPath=“/”;
    options.authenticationpath.LogOutCallbackPath=“/authentication/logout callbackpath”;
    })
    .AddAccountClaimsPrincipalFactory();
    AuthorityConnection=builder.Configuration.GetSection(“oidc:Authority”).Value;
    
    直接在导航菜单中工作


    您的公共属性不需要
    [参数]
    注释吗?这就是问题所在。谢谢您,我应该研究一下如何使用aspNetCore MenuItem!
    @if (string.IsNullOrWhiteSpace(Roles) && RequireAuthentication == false)
    {
        @ChildContent
    }
    else
    {
        <AuthorizeView Roles="@Roles">
            @ChildContent
        </AuthorizeView>
    }
    @code {
        [Parameter]
        public bool RequireAuthentication { get; set; }
    
        [Parameter]
        public string Roles { get; set; }
    
        [Parameter]
        public RenderFragment ChildContent { get; set; }
    }
    
    <OptionalRolesAuthorizeView RequireAuthentication="@Model.RequireAuthentication" Roles="@Model.Roles">
        <li class="nav-item px-3">
            <NavLink class="nav-link" href="@Model.Href" Match="@Model.Match">
                <span class="@Model.IconClass" aria-hidden="true"></span> @Model.Label
            </NavLink>
        </li>
    </OptionalRolesAuthorizeView>
    @code {
        [Parameter]
        public MenuItem Model { get; set; }
    }
    
    using Microsoft.AspNetCore.Components.Routing;
    public class MenuItem
    {
        public string Label { get; set; }
        public string Href { get; set; }
        public string IconClass { get; set; }
        public bool RequireAuthentication { get; set; }
        public NavLinkMatch Match { get; set; }
        public string Roles { get; set; }
    }