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

时间:2017-03-01 14:32:52

标签: c# asp.net-mvc asp.net-mvc-5

我有一个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中,则本地版本和部署版本都可以按预期正常工作。

在我的扩展方法中,我应该做些什么不同的事情吗?

1 个答案:

答案 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?