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