在HTMLhelper中生成URL

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (3)
  • 关注 (0)
  • 查看 (174)

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

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

但是,我无法从自定义HTML帮助程序中找到如何实现它。我有

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

Helper变量有Action和GenerateLink方法,但是它们生成<a>我在ASP里做了些调查.NETMVC源代码,但我找不到直截了当的方法。

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

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

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

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

但这似乎不对。我不想自己处理UrlHelper的例子。一定有更简单的办法。

提问于
用户回答回答于

这是我的小扩展方法UrlHelper一种HtmlHelper例如:

  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');
    //...
}

(我把这张ANS贴出来,仅供参考)

用户回答回答于

您还可以使用UrlHelper公共和静态类:

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

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

用户回答回答于

您可以在htmlhelper扩展方法中创建这样的urlhelper:

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

扫码关注云+社区

领取腾讯云代金券