繁体   English   中英

在HTML扩展方法中创建启用了根站点的锚标记链接

[英]Create a root site enabled anchor tag link in an Html Extension method

我有一个MVC 5应用程序。

我正在为帮助页面添加静态html文件,这些文件位于根项目下的“帮助”文件夹中。

我创建了一个HTML Helper扩展程序来创建锚标记。

public static MvcHtmlString TestHelpLink(this System.Web.Mvc.HtmlHelper htmlHelper, string helpTopic)
{
    var sb = new StringBuilder();

    sb.Append("<a target='_blank' href='~/help/" + helpTopic + ".html'>");

    sb.Append("<i class='glyphicon glyphicon-question-sign'></i>");
    sb.Append("</a>");

    return new MvcHtmlString(sb.ToString());
}

在生产环境中将应用程序部署到IIS时,会发生此问题。

即使我使用〜格式的根url也被忽略了,我认为它将解决该特定问题。

如果我复制扩展方法的结果字符串并将其直接粘贴到View的HTML中,则本地版本和已部署版本都可以按预期正常工作。

我的扩展方法是否应该做些不同的事情?

检查生成的URL后,我发现锚标记的href部分未转换为正确的页面URL,如下所示:

<a target='_blank' href='~/help/[help topic].html'><i class='glyphicon glyphicon-question-sign'>Link Text</i></a>

从上面给出的输出字符串中,我们可以得出结论, MvcHtmlString不会自动以~/格式转换相对URL路径,因此应该使用UrlHelper.Content()方法转换相对URL部分,该方法包含HtmlHelper类中的当前ViewContext.RequestContext (贷方到@Curtis Buys):

public static MvcHtmlString TestHelpLink(this HtmlHelper htmlHelper, string helpTopic)
{
    var sb = new StringBuilder();

    // taken from /a/363994/6378815
    var url = new UrlHelper(htmlHelper.ViewContext.RequestContext);

    sb.Append("<a target='_blank' href='" + url.Content("~/help/" + helpTopic + ".html") + "'>");
    sb.Append("<i class='glyphicon glyphicon-question-sign'>Test Link</i>");
    sb.Append("</a>");

    return MvcHtmlString.Create(sb.ToString());
}

修改后的方法将产生以下锚标记(使用浏览器检查器):

<!-- Correct output -->
<a target='_blank' href='/help/[help topic].html'><i class='glyphicon glyphicon-question-sign'>Link Text</i></a>

PS: TagHelper类可用于通过MergeAttribute方法使用与上述相同的更正输出来构建锚标记。

public static MvcHtmlString TestHelpLink(this HtmlHelper htmlHelper, string helpTopic)
{
    var sb = new StringBuilder();

    // taken from /a/363994/6378815
    var url = new UrlHelper(htmlHelper.ViewContext.RequestContext);

    var builder = new TagBuilder("a");
    builder.MergeAttribute("target", "_blank");
    builder.MergeAttribute("href", url.Content("~/help/" + helpTopic + ".html"));

    sb.Append(builder.ToString(TagRenderMode.StartTag));
    sb.Append("<i class='glyphicon glyphicon-question-sign'>Link Text</i>");
    sb.Append(builder.ToString(TagRenderMode.EndTag));

    return MvcHtmlString.Create(sb.ToString());
}

参考文献:

UrlHelper.Content方法 (MSDN)

在ASP.NET MVC中,如何使用C#代码中的Razor @ Url.Content()帮助器?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM