如何在使用 TagHelpers 时突出显示导航栏菜单项 (Asp.Net.MVC6 6.0.0-rc1.0-final)
How to Highlight navbar Menu Items in using TagHelpers (Asp.Net.MVC6 6.0.0-rc1.0-final)
我想在 asp.net 5 1.0.0-rc1-final 的菜单链接中生成 class="active",以突出显示 [=35] 中导航栏的活动菜单=].
这里提出的解决方案:Original post by Prashant Adepu 在 Asp.Net.MVC 6.0.0 beta5 中工作正常。
然而在6.0.0 rc1 (asp.net 1.0.0 rc-1 final)中,似乎不可能使用[ViewContext]修饰因为这个属性不存在。
有解决办法吗?
1) 下面是对 rc-1 稍作修改的代码。
除 [ViewContext] 被拒绝 外,一切正常。如果没有此属性,viewContext 将在 运行 时间后为空。
2) 到运行你应该创建一个asp.net5 WebApplicationX,并在_ViewImports.cshtml.
中添加@addTagHelper "WebApplicationX.TagHelpers.MenuLinkTagHelper, WebApplicationX"
然后只需使用 <menulink controller-name="Home" action-name="About" menu-text="About"></menulink>
而不是常规 mvc <a asp-controller="Home" asp-action="Index">Home</a>
Anchor.
using Microsoft.AspNet.Mvc;
using Microsoft.AspNet.Mvc.Rendering;
using Microsoft.AspNet.Razor.Runtime.TagHelpers;
using Microsoft.AspNet.Razor.TagHelpers;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace WebApplicationX.TagHelpers
{
[HtmlTargetElement("menulink", Attributes = "controller-name, action-name, menu-text")]
public class MenuLinkTagHelper : TagHelper
{
public string ControllerName { get; set; }
public string ActionName { get; set; }
public string MenuText { get; set; }
[ViewContext] //*** This is not allowed.***
public ViewContext ViewContext { get; set; }
public IUrlHelper _UrlHelper { get; set; }
public MenuLinkTagHelper(IUrlHelper urlHelper)
{
_UrlHelper = urlHelper;
}
public override void Process(TagHelperContext context, TagHelperOutput output)
{
StringBuilder sb = new StringBuilder();
string menuUrl = _UrlHelper.Action(ActionName, ControllerName);
output.TagName = "li";
var a = new TagBuilder("a");
a.MergeAttribute("href", $"{menuUrl}");
a.MergeAttribute("title", MenuText);
a.InnerHtml.Append(MenuText);
var routeData = ViewContext.RouteData.Values;
var currentController = routeData["controller"];
var currentAction = routeData["action"];
if (String.Equals(ActionName, currentAction as string, StringComparison.OrdinalIgnoreCase)
&& String.Equals(ControllerName, currentController as string, StringComparison.OrdinalIgnoreCase))
{
output.Attributes.Add("class", "active");
}
output.Content.SetContent(a.ToString());
}
}
}
ViewContext 属性仍然存在。它在 Microsoft.AspNet.Mvc.ViewFeatures 中,而不是在 Microsoft.AspNet.Mvc.Rendering 中(ViewContext class 本身所在的位置)。确保选择正确的。您可以在此处查看示例:https://github.com/DannyvanderKraan/TagHelpers
感谢 Danny 的帮助,在重温原著后,您可以在下面找到 1.0.0-rc1-final 的工作代码
using Microsoft.AspNet.Mvc;
using Microsoft.AspNet.Mvc.Rendering;
using Microsoft.AspNet.Mvc.ViewFeatures; //change for 1.0.0-rc1.0-final
using Microsoft.AspNet.Razor.TagHelpers;
using System;
using System.Text;
namespace WebAppName.TagHelpers
{
[HtmlTargetElement("menulink", Attributes = "controller-name, action-name, menu-text")]
public class MenuLinkTagHelper : TagHelper
{
public string ControllerName { get; set; }
public string ActionName { get; set; }
public string MenuText { get; set; }
[ViewContext]
public ViewContext ViewContext { get; set; }
public IUrlHelper _UrlHelper { get; set; }
public MenuLinkTagHelper(IUrlHelper urlHelper)
{
_UrlHelper = urlHelper;
}
public override void Process(TagHelperContext context, TagHelperOutput output)
{
StringBuilder sb = new StringBuilder();
string menuUrl = _UrlHelper.Action(ActionName, ControllerName);
output.TagName = "li";
var a = new TagBuilder("a");
a.MergeAttribute("href", $"{menuUrl}");
a.MergeAttribute("title", MenuText);
a.InnerHtml.Append(MenuText); //change for 1.0.0-rc1.0-final
var routeData = ViewContext.RouteData.Values;
var currentController = routeData["controller"];
var currentAction = routeData["action"];
if (String.Equals(ActionName, currentAction as string, StringComparison.OrdinalIgnoreCase)
&& String.Equals(ControllerName, currentController as string, StringComparison.OrdinalIgnoreCase))
{
output.Attributes.Add("class", "active");
}
output.Content.Append(a); //change for 1.0.0-rc1.0-final
}
}
}
我想在 asp.net 5 1.0.0-rc1-final 的菜单链接中生成 class="active",以突出显示 [=35] 中导航栏的活动菜单=].
这里提出的解决方案:Original post by Prashant Adepu 在 Asp.Net.MVC 6.0.0 beta5 中工作正常。
然而在6.0.0 rc1 (asp.net 1.0.0 rc-1 final)中,似乎不可能使用[ViewContext]修饰因为这个属性不存在。
有解决办法吗?
1) 下面是对 rc-1 稍作修改的代码。
除 [ViewContext] 被拒绝 外,一切正常。如果没有此属性,viewContext 将在 运行 时间后为空。
2) 到运行你应该创建一个asp.net5 WebApplicationX,并在_ViewImports.cshtml.
中添加@addTagHelper "WebApplicationX.TagHelpers.MenuLinkTagHelper, WebApplicationX"
然后只需使用 <menulink controller-name="Home" action-name="About" menu-text="About"></menulink>
而不是常规 mvc <a asp-controller="Home" asp-action="Index">Home</a>
Anchor.
using Microsoft.AspNet.Mvc;
using Microsoft.AspNet.Mvc.Rendering;
using Microsoft.AspNet.Razor.Runtime.TagHelpers;
using Microsoft.AspNet.Razor.TagHelpers;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace WebApplicationX.TagHelpers
{
[HtmlTargetElement("menulink", Attributes = "controller-name, action-name, menu-text")]
public class MenuLinkTagHelper : TagHelper
{
public string ControllerName { get; set; }
public string ActionName { get; set; }
public string MenuText { get; set; }
[ViewContext] //*** This is not allowed.***
public ViewContext ViewContext { get; set; }
public IUrlHelper _UrlHelper { get; set; }
public MenuLinkTagHelper(IUrlHelper urlHelper)
{
_UrlHelper = urlHelper;
}
public override void Process(TagHelperContext context, TagHelperOutput output)
{
StringBuilder sb = new StringBuilder();
string menuUrl = _UrlHelper.Action(ActionName, ControllerName);
output.TagName = "li";
var a = new TagBuilder("a");
a.MergeAttribute("href", $"{menuUrl}");
a.MergeAttribute("title", MenuText);
a.InnerHtml.Append(MenuText);
var routeData = ViewContext.RouteData.Values;
var currentController = routeData["controller"];
var currentAction = routeData["action"];
if (String.Equals(ActionName, currentAction as string, StringComparison.OrdinalIgnoreCase)
&& String.Equals(ControllerName, currentController as string, StringComparison.OrdinalIgnoreCase))
{
output.Attributes.Add("class", "active");
}
output.Content.SetContent(a.ToString());
}
}
}
ViewContext 属性仍然存在。它在 Microsoft.AspNet.Mvc.ViewFeatures 中,而不是在 Microsoft.AspNet.Mvc.Rendering 中(ViewContext class 本身所在的位置)。确保选择正确的。您可以在此处查看示例:https://github.com/DannyvanderKraan/TagHelpers
感谢 Danny 的帮助,在重温原著后,您可以在下面找到 1.0.0-rc1-final 的工作代码
using Microsoft.AspNet.Mvc;
using Microsoft.AspNet.Mvc.Rendering;
using Microsoft.AspNet.Mvc.ViewFeatures; //change for 1.0.0-rc1.0-final
using Microsoft.AspNet.Razor.TagHelpers;
using System;
using System.Text;
namespace WebAppName.TagHelpers
{
[HtmlTargetElement("menulink", Attributes = "controller-name, action-name, menu-text")]
public class MenuLinkTagHelper : TagHelper
{
public string ControllerName { get; set; }
public string ActionName { get; set; }
public string MenuText { get; set; }
[ViewContext]
public ViewContext ViewContext { get; set; }
public IUrlHelper _UrlHelper { get; set; }
public MenuLinkTagHelper(IUrlHelper urlHelper)
{
_UrlHelper = urlHelper;
}
public override void Process(TagHelperContext context, TagHelperOutput output)
{
StringBuilder sb = new StringBuilder();
string menuUrl = _UrlHelper.Action(ActionName, ControllerName);
output.TagName = "li";
var a = new TagBuilder("a");
a.MergeAttribute("href", $"{menuUrl}");
a.MergeAttribute("title", MenuText);
a.InnerHtml.Append(MenuText); //change for 1.0.0-rc1.0-final
var routeData = ViewContext.RouteData.Values;
var currentController = routeData["controller"];
var currentAction = routeData["action"];
if (String.Equals(ActionName, currentAction as string, StringComparison.OrdinalIgnoreCase)
&& String.Equals(ControllerName, currentController as string, StringComparison.OrdinalIgnoreCase))
{
output.Attributes.Add("class", "active");
}
output.Content.Append(a); //change for 1.0.0-rc1.0-final
}
}
}