SmartBreadcrumb.razor 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. @using Microsoft.AspNetCore.Components.Routing
  2. @inject NavigationManager NavigationManager
  3. <AntDesign.Breadcrumb>
  4. @foreach (var crumb in breadcrumbs)
  5. {
  6. <AntDesign.BreadcrumbItem>
  7. <NavLink href="@crumb.Url">@crumb.Text</NavLink>
  8. </AntDesign.BreadcrumbItem>
  9. }
  10. </AntDesign.Breadcrumb>
  11. @code {
  12. private List<BreadcrumbItem> breadcrumbs = new List<BreadcrumbItem>();
  13. protected override void OnInitialized()
  14. {
  15. GenerateBreadcrumbs();
  16. NavigationManager.LocationChanged += OnLocationChanged;
  17. }
  18. private void OnLocationChanged(object sender, LocationChangedEventArgs e)
  19. {
  20. GenerateBreadcrumbs();
  21. StateHasChanged();
  22. }
  23. private void GenerateBreadcrumbs()
  24. {
  25. breadcrumbs.Clear();
  26. breadcrumbs.Add(new BreadcrumbItem { Text = "", Url = "/" });
  27. var uri = NavigationManager.ToBaseRelativePath(NavigationManager.Uri);
  28. var segments = uri.Trim('/').Split('/');
  29. var breadcrumbNames = new List<string>();
  30. FindBreadcrumbNames(Global.Menus, segments, 0, ref breadcrumbNames);
  31. if (breadcrumbNames?.Count > 0)
  32. {
  33. foreach (var item in breadcrumbNames)
  34. {
  35. breadcrumbs.Add(new BreadcrumbItem { Text = item });
  36. }
  37. }
  38. }
  39. private bool FindBreadcrumbNames(List<SystemMenu> menus, string[] segments, int index, ref List<string> breadcrumbNames)
  40. {
  41. if (index >= segments.Length)
  42. {
  43. return false;
  44. }
  45. foreach (var menu in menus)
  46. {
  47. var menusplit = menu.Path.Trim('/').Split('/');
  48. //var menuPath = menu.Path.Trim('/');
  49. if (menusplit[index] == segments[index])
  50. {
  51. breadcrumbNames.Add(menu.Name);
  52. if (index == segments.Length - 1 || (menu.Children != null && FindBreadcrumbNames(menu.Children, segments, index + 1, ref breadcrumbNames)))
  53. {
  54. return true;
  55. }
  56. }
  57. }
  58. return false;
  59. }
  60. public class BreadcrumbItem
  61. {
  62. public string Text { get; set; }
  63. public string Url { get; set; }
  64. }
  65. public void Dispose()
  66. {
  67. NavigationManager.LocationChanged -= OnLocationChanged;
  68. }
  69. }