在这个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。
是否可以动态生成和呈现这些链接?如果是这样,怎么样?
答案 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"