具有asp-controller和asp-action属性的锚点不会呈现为链接

时间:2016-02-23 13:16:22

标签: c# asp.net-mvc razor asp.net-core-mvc

在这个Razor语法中:

<a asp-controller="Home" asp-action="Index">Home</a>

@foreach (LinkNodeModel link in Model.ControlActions)
{
    link.LinkTree();
}

&#34; Home&#34;链接呈现得很好,但手动呈现的<a>字符串不会变成有效的链接。

LinkTree()的实现方式如下:

return $"<a asp-controller=\"{Controller}\" asp-action=\"{Action}\">{Name}</a>";

当我使用@link.LinkTree()打印链接时,输出中包含的行只显示了代码,但没有链接。

使用@Html.Raw(link.LinkTree())我得到链接,但是它们不可点击,因为它们实际上将HTML-controller / asp-action属性打印到HTML而不是生成href。

是否可以动态生成和呈现这些链接?如果是这样,怎么样?

2 个答案:

答案 0 :(得分:4)

Razor引擎不处理从方法返回的HTML代码或实际上任何文本,因此您不能在此处使用HTML标记帮助程序。

您可以执行的操作是调用“经典”HtmlHelper.ActionLink方法(或者更有用的extension methods之一)来为控制器操作返回正确呈现的a标记。由于它只是一种常规方法,因此您可以在自己的方法中调用它。

例如,您可以将IHtmlHelper对象传入您的方法:

@foreach (LinkNodeModel link in Model.ControlActions)
{
    link.LinkTree(@Html);
}

然后在您的方法中,只需使用ActionLink重载来创建链接:

public IHtmlContent LinkTree(IHtmlHelper helper)
{
    return helper.ActionLink(Name, Action, Controller);
}

或者,您也可以在对象上公开这三个属性,并使用Razor正确编写链接:

@foreach (LinkNodeModel link in Model.ControlActions)
{
    <a asp-controller="@link.Controller" asp-action="@link.Action">@link.Name</a>
}

答案 1 :(得分:1)

标记助手,可转换<a asp-controller="$controller" asp-action="$action"&gt;如Introducing TagHelpers in ASP.NET MVC 6中所述选择加入<a href="/$controller/$action">,因此您需要配置应用程序以使用它们:

  

这最好放在_ViewImports.cshtml文件中,这是一个在ASP.NET 5中引入的新Razor文件:

@addTagHelper "*, Microsoft.AspNet.Mvc.TagHelpers"