如何从 TagHelper 解析 ~ root link
how to resolve ~ root link from a TagHelper
在 ASP.NET 5 MVC6 RC1 中 - 我有一个 ViewComponent,它旨在代表我的传统 "left hand side of the screen" 主菜单。
我正在编写我的第一个 TagHelper 来表示每个菜单项 link。
我卡在了尝试创建 hyperlink 的部分。
如何解决~/dashboard/summary?
如果我在此页面上显示菜单,link 显示为 /dashboard/~/dashboard/summary
。
@Url.Content("...")
显示 @Url.Content("...")
即不作为剃须刀处理。标签助手输出纯。
理想情况下,我希望解决方案与 .NET Core 兼容,因为我最终的目标是 .net Core 可部署解决方案。
见下文:
namespace Website
{
/// <summary>
/// <MainMenuLink area="" controller="" action=""></MainMenuLink>
///
/// to render
///
/// <a href="~/account/manage/ChangePassword" class="list-group-item @GetClassName("manage", "changepassword")">
/// <p class="list-group-item-text"><i class="fa fa-terminal"></i> Change my password</p>
/// </a>
///
///
/// </summary>
[HtmlTargetElement(Attributes = "area, controller, action")]
public class MainMenuLinkTagHelper : TagHelper
{
[HtmlAttributeName("area")]
public string Area { get; set; }
[HtmlAttributeName("controller")]
public string Controller { get; set; }
[HtmlAttributeName("action")]
public string Action { get; set; }
public UrlHelper urlHelper { get; set; }
public override void Process(TagHelperContext context, TagHelperOutput output)
{
output.TagName = "a"; // Works
// Stuck here - I want ~/ to resolve to the base root.
// At the moment the address is here is localhost:XXXXX/dashboard/~/dashboard/summary
// Would prefer to use a method which can be used with .net core and not System.Web
output.Attributes.Add("href", "~/dashboard/summary");
output.Content.SetHtmlContent("Click me");
}
/// <summary>
}
}
谢谢!
段.
在标签助手中为 IUrlHelper
添加构造函数依赖项。然后使用可以在视图中使用的相同 extension methods 来生成像 IUrlHelper.Action(actionName, controllerName)
:
这样的 url
private IUrlHelper urlHelper;
...
public MainMenuLinkTagHelper (IUrlHelper urlHelper)
{
this.urlHelper = urlHelper;
}
...
public override void Process(TagHelperContext context, TagHelperOutput output)
{
output.TagName = "a";
output.Attributes.Add("href", this.urlHelper.Action(this.Action, this.Controller));
output.Content.SetHtmlContent("Click me");
}
编辑:ASP 核心版本 1.0
无法再直接注入 IUrlHelper
。
你需要同时注入 IActionContextAccessor
和 IUrlHelperFactory
,然后得到一个 IUrlHelper
。
例如:
private IUrlHelper UrlHelper =>
this.urlHelperFactory.GetUrlHelper(this.actionAccessor.ActionContext);
ASP Core 2.0 默认情况下似乎没有在 IServiceCollection
中包含 IActionContextAccessor
因此您需要在启动时注册它对于可接受的解决方案:
services.AddSingleton<IActionContextAccessor, ActionContextAccessor>();
否则提供的属性可以将 TagHelper
的 属性 设置为扩展 ActionContext
的 ViewContext
using Microsoft.AspNetCore.Mvc.Rendering;
using Microsoft.AspNetCore.Mvc.Routing;
using Microsoft.AspNetCore.Mvc.ViewFeatures;
using Microsoft.AspNetCore.Razor.TagHelpers;
[HtmlTargetElement("my-tag")]
public class MyTagHelper : TagHelper {
private readonly IUrlHelperFactory urlHelperFactory;
[ViewContext]
[HtmlAttributeNotBound]
public ViewContext ViewContext { get; set; }
public MyTagHelper (IUrlHelperFactory urlHelperFactory) {
this.urlHelperFactory = urlHelperFactory;
}
public override void Process(TagHelperContext context, TagHelperOutput output) {
var urlHelper = urlHelperFactory.GetUrlHelper(ViewContext);
}
}
注意:ViewContext
属性 必须有一个 public set 方法
在 ASP.NET 5 MVC6 RC1 中 - 我有一个 ViewComponent,它旨在代表我的传统 "left hand side of the screen" 主菜单。
我正在编写我的第一个 TagHelper 来表示每个菜单项 link。
我卡在了尝试创建 hyperlink 的部分。
如何解决~/dashboard/summary?
如果我在此页面上显示菜单,link 显示为 /dashboard/~/dashboard/summary
。
@Url.Content("...")
显示 @Url.Content("...")
即不作为剃须刀处理。标签助手输出纯。
理想情况下,我希望解决方案与 .NET Core 兼容,因为我最终的目标是 .net Core 可部署解决方案。
见下文:
namespace Website
{
/// <summary>
/// <MainMenuLink area="" controller="" action=""></MainMenuLink>
///
/// to render
///
/// <a href="~/account/manage/ChangePassword" class="list-group-item @GetClassName("manage", "changepassword")">
/// <p class="list-group-item-text"><i class="fa fa-terminal"></i> Change my password</p>
/// </a>
///
///
/// </summary>
[HtmlTargetElement(Attributes = "area, controller, action")]
public class MainMenuLinkTagHelper : TagHelper
{
[HtmlAttributeName("area")]
public string Area { get; set; }
[HtmlAttributeName("controller")]
public string Controller { get; set; }
[HtmlAttributeName("action")]
public string Action { get; set; }
public UrlHelper urlHelper { get; set; }
public override void Process(TagHelperContext context, TagHelperOutput output)
{
output.TagName = "a"; // Works
// Stuck here - I want ~/ to resolve to the base root.
// At the moment the address is here is localhost:XXXXX/dashboard/~/dashboard/summary
// Would prefer to use a method which can be used with .net core and not System.Web
output.Attributes.Add("href", "~/dashboard/summary");
output.Content.SetHtmlContent("Click me");
}
/// <summary>
}
}
谢谢! 段.
在标签助手中为 IUrlHelper
添加构造函数依赖项。然后使用可以在视图中使用的相同 extension methods 来生成像 IUrlHelper.Action(actionName, controllerName)
:
private IUrlHelper urlHelper;
...
public MainMenuLinkTagHelper (IUrlHelper urlHelper)
{
this.urlHelper = urlHelper;
}
...
public override void Process(TagHelperContext context, TagHelperOutput output)
{
output.TagName = "a";
output.Attributes.Add("href", this.urlHelper.Action(this.Action, this.Controller));
output.Content.SetHtmlContent("Click me");
}
编辑:ASP 核心版本 1.0
无法再直接注入 IUrlHelper
。
你需要同时注入 IActionContextAccessor
和 IUrlHelperFactory
,然后得到一个 IUrlHelper
。
例如:
private IUrlHelper UrlHelper =>
this.urlHelperFactory.GetUrlHelper(this.actionAccessor.ActionContext);
ASP Core 2.0 默认情况下似乎没有在 IServiceCollection
中包含 IActionContextAccessor
因此您需要在启动时注册它对于可接受的解决方案:
services.AddSingleton<IActionContextAccessor, ActionContextAccessor>();
否则提供的属性可以将 TagHelper
的 属性 设置为扩展 ActionContext
ViewContext
using Microsoft.AspNetCore.Mvc.Rendering;
using Microsoft.AspNetCore.Mvc.Routing;
using Microsoft.AspNetCore.Mvc.ViewFeatures;
using Microsoft.AspNetCore.Razor.TagHelpers;
[HtmlTargetElement("my-tag")]
public class MyTagHelper : TagHelper {
private readonly IUrlHelperFactory urlHelperFactory;
[ViewContext]
[HtmlAttributeNotBound]
public ViewContext ViewContext { get; set; }
public MyTagHelper (IUrlHelperFactory urlHelperFactory) {
this.urlHelperFactory = urlHelperFactory;
}
public override void Process(TagHelperContext context, TagHelperOutput output) {
var urlHelper = urlHelperFactory.GetUrlHelper(ViewContext);
}
}
注意:ViewContext
属性 必须有一个 public set 方法