我有一个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时会出现问题。
即使我使用了〜格式,根据我认为可以解决该特定问题,根网址也会被忽略。
如果我复制扩展方法的结果字符串并将其直接粘贴到View的HTML中,则本地版本和部署版本都可以按预期正常工作。
在我的扩展方法中,我应该做些什么不同的事情吗?
答案 0 :(得分:1)
检查生成的网址后,我发现锚标记中的var x = { 1: 1, 2: 2, hi: "hi" };
var y = { hello: "hello", coffee: "coffee" };
var a = {};
_.mapValues(x, function(v, k) {
a[k] = v;
});
_.mapValues(y, function(v, k) {
a[k] = v;
})
部分未转换为正确的网页网址,如下所示:
href
从上面给出的输出字符串中,我们可以得出结论<a target='_blank' href='~/help/[help topic].html'><i class='glyphicon glyphicon-question-sign'>Link Text</i></a>
没有自动转换前导MvcHtmlString
格式的相对网址路径,因此相对网址部分应该使用~/
进行转换包含来自UrlHelper.Content()
类的当前ViewContext.RequestContext
的方法(归功于@Curtis Buys):
HtmlHelper
修改后的方法将生成此锚标记(使用浏览器检查器):
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());
}
PS:<!-- Correct output -->
<a target='_blank' href='/help/[help topic].html'><i class='glyphicon glyphicon-question-sign'>Link Text</i></a>
类可用于使用TagHelper
方法构建具有与上述相同的校正输出的锚标记:
MergeAttribute
参考文献:
UrlHelper.Content Method(MSDN)
In ASP.NET MVC how can I use the Razor @Url.Content() helper from C# code?