在HTML助手中生成URL

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

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

但是,我无法find如何从自定义的HTML帮手。 我有

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

辅助variables具有Action和GenerateLink方法,但是它们生成<a> 。 我在ASP.NET MVC源代码中做了一些挖掘,但是我找不到一个简单的方法。

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

总之,我认为这是可能的,但是由于我能看到的所有方法都涉及到一些或多或less的内部ASP.NET的东西,我想知道是否有更好的方法。

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

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

但这看起来不正确。 我不想自己处理UrlHelper的实例。 必须有一个更简单的方法。

你可以在html helper扩展方法里这样创buildurl helper:

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

你也可以使用UrlHelper public和static类来获取链接:

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

在这个例子中,你不必创build新的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'); //... } 

(我发布这个答案仅供参考)