diff --git a/examples/RazorPagesAndMvc/Controllers/Java/EasyJavaController.cs b/examples/RazorPagesAndMvc/Controllers/Java/EasyJavaController.cs
index fc47e48..7e6a2eb 100644
--- a/examples/RazorPagesAndMvc/Controllers/Java/EasyJavaController.cs
+++ b/examples/RazorPagesAndMvc/Controllers/Java/EasyJavaController.cs
@@ -1,5 +1,7 @@
using Microsoft.AspNetCore.Mvc;
using SmartBreadcrumbs.Attributes;
+using SmartBreadcrumbs.Extensions;
+using SmartBreadcrumbs.Nodes;
namespace RazorPagesAndMvc.Controllers.Java
{
@@ -19,5 +21,19 @@ public IActionResult Post1()
return View();
}
+ public IActionResult Post2()
+ {
+ var builder = new FluentBreadcrumbNodeBuilder()
+ .AddMvcNode("Index", "Java", "Java")
+ .AddMvcNode(nameof(Index), "EasyJava", "Easy")
+ .AddMvcNode(nameof(Post2), "EasyJava", "Post 2")
+ .EndNode()
+ .EndNode()
+ .EndNode();
+
+ ViewData.SetBreadcrumbs(builder.Build());
+
+ return View();
+ }
}
}
\ No newline at end of file
diff --git a/examples/RazorPagesAndMvc/Pages/Index.cshtml b/examples/RazorPagesAndMvc/Pages/Index.cshtml
index 0a51718..2a1eccc 100644
--- a/examples/RazorPagesAndMvc/Pages/Index.cshtml
+++ b/examples/RazorPagesAndMvc/Pages/Index.cshtml
@@ -43,6 +43,9 @@
Post 1
+
+ Post 2
+
diff --git a/examples/RazorPagesAndMvc/Views/EasyJava/Index.cshtml b/examples/RazorPagesAndMvc/Views/EasyJava/Index.cshtml
index 5193a8e..8a4f17d 100644
--- a/examples/RazorPagesAndMvc/Views/EasyJava/Index.cshtml
+++ b/examples/RazorPagesAndMvc/Views/EasyJava/Index.cshtml
@@ -10,4 +10,7 @@
Post 1
+
+ Post 2
+
\ No newline at end of file
diff --git a/examples/RazorPagesAndMvc/Views/EasyJava/Post2.cshtml b/examples/RazorPagesAndMvc/Views/EasyJava/Post2.cshtml
new file mode 100644
index 0000000..19e8111
--- /dev/null
+++ b/examples/RazorPagesAndMvc/Views/EasyJava/Post2.cshtml
@@ -0,0 +1,8 @@
+
+@{
+ ViewData["Title"] = "Post2";
+ Layout = "~/Pages/Shared/_Layout.cshtml";
+}
+
+Post 2
+
diff --git a/examples/RazorPagesAndMvc/Views/Java/Index.cshtml b/examples/RazorPagesAndMvc/Views/Java/Index.cshtml
index 193f53c..a0eb26d 100644
--- a/examples/RazorPagesAndMvc/Views/Java/Index.cshtml
+++ b/examples/RazorPagesAndMvc/Views/Java/Index.cshtml
@@ -12,6 +12,9 @@
Post 1
+
+ Post 2
+
diff --git a/src/Extensions/ViewDataDictionaryExtensions.cs b/src/Extensions/ViewDataDictionaryExtensions.cs
new file mode 100644
index 0000000..c54cbfb
--- /dev/null
+++ b/src/Extensions/ViewDataDictionaryExtensions.cs
@@ -0,0 +1,13 @@
+using Microsoft.AspNetCore.Mvc.ViewFeatures;
+using SmartBreadcrumbs.Nodes;
+
+namespace SmartBreadcrumbs.Extensions
+{
+ public static class ViewDataDictionaryExtensions
+ {
+ public static void SetBreadcrumbs(this ViewDataDictionary viewData, BreadcrumbNode breadcrumb)
+ {
+ viewData["BreadcrumbNode"] = breadcrumb;
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/Nodes/FluentBreadcrumbNodeBuilder.cs b/src/Nodes/FluentBreadcrumbNodeBuilder.cs
new file mode 100644
index 0000000..148f658
--- /dev/null
+++ b/src/Nodes/FluentBreadcrumbNodeBuilder.cs
@@ -0,0 +1,137 @@
+namespace SmartBreadcrumbs.Nodes
+{
+ public class FluentBreadcrumbNodeBuilder
+ {
+ private readonly FluentBreadcrumbNodeBuilder parent;
+ private BreadcrumbNode node;
+ private bool isFirstNodeInitializing;
+
+ private BreadcrumbNode lastNode;
+
+ public FluentBreadcrumbNodeBuilder()
+ {
+ isFirstNodeInitializing = true;
+ }
+
+ public FluentBreadcrumbNodeBuilder(BreadcrumbNode node, FluentBreadcrumbNodeBuilder parent = null)
+ {
+ this.node = node;
+ this.parent = parent;
+ }
+
+ public FluentBreadcrumbNodeBuilder AddNode(BreadcrumbNode node)
+ {
+ if (isFirstNodeInitializing)
+ {
+ this.node = node;
+ isFirstNodeInitializing = false;
+ return this;
+ }
+ else
+ {
+ return new FluentBreadcrumbNodeBuilder(node, this);
+ }
+ }
+
+ public FluentBreadcrumbNodeBuilder AddMvcNode(
+ string action, string controller, string title, bool overwriteTitleOnExactMatch = false, string iconClasses = null, string areaName = null)
+ {
+ var node = new MvcBreadcrumbNode(action, controller, title, overwriteTitleOnExactMatch, iconClasses, areaName);
+
+ if (isFirstNodeInitializing)
+ {
+ this.node = node;
+ isFirstNodeInitializing = false;
+ return this;
+ }
+ else
+ {
+ return new FluentBreadcrumbNodeBuilder(node, this);
+ }
+ }
+
+ public FluentBreadcrumbNodeBuilder AddMvcControllerNode(
+ string controller, string title, bool overwriteTitleOnExactMatch = false, string iconClasses = null, string areaName = null)
+ {
+ var node = new MvcControllerBreadcrumbNode(controller, title, overwriteTitleOnExactMatch, iconClasses, areaName);
+
+ if (isFirstNodeInitializing)
+ {
+ this.node = node;
+ isFirstNodeInitializing = false;
+ return this;
+ }
+ else
+ {
+ return new FluentBreadcrumbNodeBuilder(node, this);
+ }
+ }
+
+ public FluentBreadcrumbNodeBuilder AddRazorPageNode(
+ string path, string title, bool overwriteTitleOnExactMatch = false, string iconClasses = null, string areaName = null)
+ {
+ var node = new RazorPageBreadcrumbNode(path, title, overwriteTitleOnExactMatch, iconClasses, areaName);
+
+ if (isFirstNodeInitializing)
+ {
+ this.node = node;
+ isFirstNodeInitializing = false;
+ return this;
+ }
+ else
+ {
+ return new FluentBreadcrumbNodeBuilder(node, this);
+ }
+ }
+
+ public FluentBreadcrumbNodeBuilder EndNode()
+ {
+ if (parent != null)
+ {
+ node.Parent = parent.node;
+
+ if (lastNode == null) // Should only happen one time
+ {
+ parent.lastNode = node;
+ }
+ else // Bubble the last node up the chain.. (to use inside Build())
+ {
+ parent.lastNode = lastNode;
+ }
+
+ return parent;
+ }
+
+ return this;
+ }
+
+ public FluentBreadcrumbNodeBuilder SetIconClasses(string iconClasses)
+ {
+ node.IconClasses = iconClasses;
+ return this;
+ }
+
+ public FluentBreadcrumbNodeBuilder SetOverwriteTitleOnExactMatch(bool overwriteTitleOnExactMatch)
+ {
+ node.OverwriteTitleOnExactMatch = overwriteTitleOnExactMatch; ;
+ return this;
+ }
+
+ public FluentBreadcrumbNodeBuilder SetRouteValues(object routeValues)
+ {
+ node.RouteValues = routeValues;
+ return this;
+ }
+
+ public FluentBreadcrumbNodeBuilder SetTitle(string title)
+ {
+ node.Title = title;
+ return this;
+ }
+
+ public BreadcrumbNode Build()
+ {
+ return lastNode;
+ }
+ }
+}
\ No newline at end of file