【问题标题】:Anchors with asp-controller and asp-action attribute don't get rendered as links具有 asp-controller 和 asp-action 属性的锚不会呈现为链接
【发布时间】:2016-02-23 13:16:22
【问题描述】:

在此 Razor 语法中:

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

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

“主页”链接呈现得很好,但手动呈现的 &lt;a&gt; 字符串不会变成有效链接。

LinkTree() 是这样实现的:

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

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

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

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

【问题讨论】:

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


    【解决方案1】:

    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>
    }
    

    【讨论】:

    • 嗯,好吧,这并没有真正使 vNext 中的动态链接生成变得更容易。但感谢您提供的信息,它为灵感奠定了基础。有没有办法跳过整个“@Html”部分?猜测它用来说明你在哪里,所以链接对你要去的地方有意义。
    • 这同样简单,因为您只需调用一个方法而不是返回一些具有魔法属性的静态字符串(在 Razor 之外,它们就像魔法一样)。 @Html 是将HtmlHelper 实例传递给方法。如果您在对象中以不同的方式访问 HTML 帮助器,则可以使用它。但最好将它传递进去以确保它有效。 – 我在我的答案中添加了另一种选择,直接在视图中创建链接,也许这对你更有效。
    • 是的,同样简单仍然不容易;)我希望生成带有子链接的链接树(例如链表)。并打印它我希望能够获取一个链接并打印降序树并将链接字符串放在我想要的位置。
    【解决方案2】:

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

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

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

    【讨论】:

    • 如果我直接写一个例子 ´Home´ 就可以了。但如果我生成那条线就不会。 taghelper 就在那里
    • 嗯,不,您在运行时生成的字符串不会被 Razor 解析,而是按原样输出。请参阅 poke 的答案以获取正确的解决方案。 Tag Helpers 例如用于内容管理系统,与@Razor 表达式相反,用户可以在其中编写更多 HTML 风格的语法。
    猜你喜欢
    • 2016-10-22
    • 1970-01-01
    • 2023-03-08
    • 2018-09-28
    • 1970-01-01
    • 2022-10-24
    • 2022-12-04
    • 2020-11-26
    • 1970-01-01
    相关资源
    最近更新 更多