Asp.net core 如何在使用TagHelpers(Asp.Net.MVC6 6.0.0-rc1.0-final)中突出显示导航栏菜单项
我想在asp.net 5 1.0.0-rc1-final中的菜单链接中生成class=“active”,以突出显示\u Layout.cshtml中导航栏的活动菜单。Asp.net core 如何在使用TagHelpers(Asp.Net.MVC6 6.0.0-rc1.0-final)中突出显示导航栏菜单项,asp.net-core,asp.net-core-mvc,tag-helpers,Asp.net Core,Asp.net Core Mvc,Tag Helpers,我想在asp.net 5 1.0.0-rc1-final中的菜单链接中生成class=“active”,以突出显示\u Layout.cshtml中导航栏的活动菜单。 这里提出的解决方案:在Asp.Net.MVC 6.0.0 beta5中运行良好。 但是,在6.0.0 rc1(asp.net 1.0.0 rc-1最终版)中,似乎不可能使用[ViewContext]装饰,因为此属性不存在。 有办法解决这个问题吗 1) 以下是对rc-1稍作修改的代码。 除了被拒绝的[ViewContext]之外,其
这里提出的解决方案:在Asp.Net.MVC 6.0.0 beta5中运行良好。 但是,在6.0.0 rc1(asp.net 1.0.0 rc-1最终版)中,似乎不可能使用[ViewContext]装饰,因为此属性不存在。
有办法解决这个问题吗 1) 以下是对rc-1稍作修改的代码。
除了被拒绝的[ViewContext]之外,其他一切都正常。如果没有此属性,viewContext在运行时将为null)。
2) 要运行它,您应该创建一个asp.net5 WebApplicationX,并在_ViewImports.cshtml中添加
@addTagHelper“WebApplicationX.TagHelpers.MenuLinkTagHelper,WebApplicationX”
。然后只需使用
而不是常规的mvc主锚定
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类本身所在的位置)中。一定要选对一个。您可以在这里查看一个示例:ViewContext属性仍然存在。它在Microsoft.AspNet.Mvc.ViewFeatures中,而不是在Microsoft.AspNet.Mvc.Rendering(ViewContext类本身所在的位置)中。一定要选对一个。您可以在这里查看一个示例:感谢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
}
}
}
多亏了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
}
}
}
谢谢,确实有帮助。但是由于某种原因,我从.ToString()的输出中得到的是Microsoft.AspNet.Mvc.Rendering.TagBuilder,而不是实际的锚。我需要与原作作进一步比较,看看原因。我会在解决它后更新。谢谢,确实很有帮助。但是由于某种原因,我从.ToString()的输出中得到的是Microsoft.AspNet.Mvc.Rendering.TagBuilder,而不是实际的锚。我需要与原作作进一步比较,看看原因。我将在解决它后进行更新。