如何动态覆盖 Html.ActionLink 生成的 URL?

Posted

技术标签:

【中文标题】如何动态覆盖 Html.ActionLink 生成的 URL?【英文标题】:How can I dynamically override the URL generated by Html.ActionLink? 【发布时间】:2014-06-17 05:07:47 【问题描述】:

我在现有的 ASP.NET MVC 网站中实现了一个小实用程序,它允许用户覆盖任何页面(包括带有查询字符串等的动态页面)的当前 html 标题、元描述和友好 URL。这工作得很好 - 直接访问友好网址时一切都很好。

我想做的是覆盖 Html.ActionLink 的默认行为,以便我可以检查是否为请求的操作创建了友好的 URL,如果是,则返回友好的 URL代替自动生成的 URL。

我环顾四周,找不到任何具体的东西。我知道我可以实现一个新的 HtmlHelper 并自己执行此操作,但如果可能的话,我想覆盖现有行为,而不是修改所有当前视图。

有人可以帮忙吗?

【问题讨论】:

我认为您无法更改 Html.ActionLink 的行为,除非您反向工程并重新编译 System.Web.Mvc.dll。 【参考方案1】:

我认为您不能覆盖操作链接本身,但您可以创建一个扩展方法并使用它来代替操作链接帮助器

using System.Web.Mvc;
using System.Web.Mvc.Html;

public static class HtmlHelperExtensions

    public static MvcHtmlString CustomActionLink(this HtmlHelper Helper, string LinkText, string ActionName)
    
        string link = getCustomName();
        if(!String.IsNullOrWhiteSpace(link))
        
            return link
        
        return helper.ActionLink(LinkText, ActionName);
    

那么在您看来,您可以将@Html.ActionLink 替换为@Html.CustomActionLink。必须将命名空间添加到每个视图的顶部,不要将其放在命名空间中,或者将其添加到配置文件中

【讨论】:

是的,这或多或少是我期望 id 最终做的事情,只是想知道是否有任何 id 遗漏,因为 id 想尽可能避免修改视图!如果事实证明这是唯一的方法,那就把它标记为答案:) 干杯! 是的,如果 ActionLink 帮助器有 EditorTemplate 或类似的东西,那就太好了,但我一直找不到。

以上是关于如何动态覆盖 Html.ActionLink 生成的 URL?的主要内容,如果未能解决你的问题,请参考以下文章

004_URL 路由 - 高级路由特性

你能用 ActionLink 生成友好的 URL 吗?

如何在 @Html.ActionLink 中添加图像

Razor actionlink 在 URL 中自动生成 ?length=7?

@html.ActionLink的几种参数格式

转@html.ActionLink的几种参数格式