在 HTML 助手中生成 URL

通常在 ASP.NET 视图中,人们可以使用以下函数来获得 URL (而不是 <a>) :

Url.Action("Action", "Controller");

但是,我不能找到如何从一个自定义的 HTML 帮助程序做到这一点

public class MyCustomHelper
{
public static string ExtensionMethod(this HtmlHelper helper)
{
}
}

Helper 变量具有 Action 和 GenerateLink 方法,但它们生成 <a>方法。我深入研究了 ASP.NET MVC 的源代码,但是找不到一个简单的方法。

问题是,上面的 Url 是视图类的一个成员,对于它的实例化,它需要一些上下文和路由映射(我不想处理这些,而且我也不应该处理这些)。或者,HtmlHelper 类的实例也有一些上下文,我假设它们是 Url 实例的上下文信息子集的子集(但是我不想处理它)。

总之,我认为这是可能的,但是因为我可以看到所有的方法,包括一些或多或少的内部 ASP.NET 东西的操作,我不知道是否有一个更好的方法。

编辑: 例如,我看到的一种可能性是:

public class MyCustomHelper
{
public static string ExtensionMethod(this HtmlHelper helper)
{
UrlHelper urlHelper = new UrlHelper(helper.ViewContext.RequestContext);
urlHelper.Action("Action", "Controller");
}
}

但这似乎并不正确。我不想自己处理 UrlHelper 的实例。肯定有更简单的办法。

63457 次浏览

你可以像这样在 html 助手扩展方法中创建 url 助手:

var urlHelper = new UrlHelper(htmlHelper.ViewContext.RequestContext);
var url = urlHelper.Action("Home", "Index")

您还可以使用 UrlHelper公共和静态类获得链接:

UrlHelper.GenerateUrl(null, actionName, controllerName, null, null, null, routeValues, htmlHelper.RouteCollection, htmlHelper.ViewContext.RequestContext, true)

在这个示例中,您不必创建新的 UrlHelper 类,这可能是一个小优势。

下面是获取 HtmlHelper实例的 UrlHelper的微型扩展方法:

  public static partial class UrlHelperExtensions
{
/// <summary>
/// Gets UrlHelper for the HtmlHelper.
/// </summary>
/// <param name="htmlHelper">The HTML helper.</param>
/// <returns></returns>
public static UrlHelper UrlHelper(this HtmlHelper htmlHelper)
{
if (htmlHelper.ViewContext.Controller is Controller)
return ((Controller)htmlHelper.ViewContext.Controller).Url;


const string itemKey = "HtmlHelper_UrlHelper";


if (htmlHelper.ViewContext.HttpContext.Items[itemKey] == null)
htmlHelper.ViewContext.HttpContext.Items[itemKey] = new UrlHelper(htmlHelper.ViewContext.RequestContext, htmlHelper.RouteCollection);


return (UrlHelper)htmlHelper.ViewContext.HttpContext.Items[itemKey];
}
}

使用它作为:

public static MvcHtmlString RenderManagePrintLink(this HtmlHelper helper, )
{
var url = htmlHelper.UrlHelper().RouteUrl('routeName');
//...
}

(我发布这个仅供参考)