网站网页主页的区别图书馆网站开发策划书
网站网页主页的区别,图书馆网站开发策划书,网站开发与应用,做婚姻网站赚钱前言最近写了多篇关于Source Generators的文章#xff0c;发现它确实可以简化我们的部分开发工作。这不#xff0c;我又盯上了Blazor。问题默认的NavMenu.razor组件用于显示导航菜单#xff0c;它的部分代码如下#xff1a;div classNavMenuCssClass oncli… 前言最近写了多篇关于Source Generators的文章发现它确实可以简化我们的部分开发工作。这不我又盯上了Blazor。问题默认的NavMenu.razor组件用于显示导航菜单它的部分代码如下div classNavMenuCssClass onclickToggleNavMenuul classnav flex-columnli classnav-item px-3NavLink classnav-link href MatchNavLinkMatch.Allspan classoi oi-home aria-hiddentrue/span Home/NavLink/lili classnav-item px-3NavLink classnav-link hrefcounterspan classoi oi-plus aria-hiddentrue/span Counter/NavLink/lili classnav-item px-3NavLink classnav-link hreffetchdataspan classoi oi-list-rich aria-hiddentrue/span Fetch data/NavLink/li/ul
/div
这也就意味着如果我们增加一个页面就要修改一次NavMenu.razor组件这当然是不合适的。实现原理我们查看obj\Debug\net5.0\Razor\Pages\Counter.razor.g.cs编译时生成的中间文件可以看到如下代码[Microsoft.AspNetCore.Components.RouteAttribute(/counter)]
public partial class Counter : Microsoft.AspNetCore.Components.ComponentBase
它其实对应源代码里的page /counter
也就是说只要我们遍历所有的Microsoft.AspNetCore.Components.RouteAttribute获得路由信息放到ListMenu即可。具体实现代码如下[Generator]public class MenuGenerator : ISourceGenerator{private const string MenuClassText
public class Menu
{public string Route { get; set; }public string Title { get; set; }
};public void Initialize(GeneratorInitializationContext context){}public void Execute(GeneratorExecutionContext context){context.AddSource(Menu, SourceText.From(MenuClassText, Encoding.UTF8));var options (context.Compilation as CSharpCompilation).SyntaxTrees[0].Options as CSharpParseOptions;var compilation context.Compilation.AddSyntaxTrees(CSharpSyntaxTree.ParseText(SourceText.From(MenuClassText, Encoding.UTF8), options));var allClasses compilation.SyntaxTrees.SelectMany(x x.GetRoot().DescendantNodes().OfTypeClassDeclarationSyntax());var sourceBuilder new StringBuilder(
using System.Collections.Generic;
namespace MenuGenerator
{public static class NavHelper{public static IEnumerableMenu GetMenus(){return new ListMenu {);foreach (var classDeclarationSyntax in allClasses){var routeAttribute classDeclarationSyntax.AttributeLists.SelectMany(x x.Attributes).FirstOrDefault(attr attr.Name.ToString() Microsoft.AspNetCore.Components.RouteAttribute);if (routeAttribute ! null){var routeArg routeAttribute.ArgumentList.Arguments.First();var routeExpr routeArg.Expression;var semanticModel compilation.GetSemanticModel(classDeclarationSyntax.SyntaxTree);var route semanticModel.GetConstantValue(routeExpr).ToString();if (route /) continue;var title classDeclarationSyntax.Identifier.ToString();sourceBuilder.Append($
new Menu{{ Route {route}, Title {title} }},);}}sourceBuilder.Append(
};
}}
});context.AddSource(Mapper, SourceText.From(sourceBuilder.ToString(), Encoding.UTF8));}}
使用示例修改NavMenu.razor代码如下div classNavMenuCssClass onclickToggleNavMenuul classnav flex-columnli classnav-item px-3NavLink classnav-link href MatchNavLinkMatch.Allspan classoi oi-home aria-hiddentrue/span Home/NavLink/liforeach (var menu in MenuGenerator.NavHelper.GetMenus()){li classnav-item px-3NavLink classnav-link hrefmenu.Routespan classoi aria-hiddentrue/span menu.Title/NavLink/li}/ul
/div
编译后可以看到自动生成的代码运行后测试工作正常成功结论菜单信息还有许多地方需要扩展比如顺序、图标、菜单名称等这些可以通过添加自定义Attribute实现。如果你觉得这篇文章对你有所启发请关注我的个人公众号”My IO“记住我
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/90015.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!