在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'); //... }
(我发布这个答案仅供参考)