0

私はMVC 5アプリケーションを持っています。Html拡張メソッドでルートサイト対応のアンカータグリンクを作成します

私は、ルートプロジェクトの下のヘルプフォルダにあるヘルプページ用の静的なhtmlファイルを追加しています。

アンカータグを作成するためのHTMLヘルパー拡張を作成しました。

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は無視されています。

拡張メソッドの結果文字列をコピーして、ビューのHTMLに直接貼り付けると、ローカルバージョンとデプロイされたバージョンが正しく動作します。

私の拡張メソッドで何か別のことをしなければならないことはありますか?上記の出力文字列から

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

、我々はMvcHtmlStringが自動的にないと結論付けることができます:

答えて

1

生成されたURLを調べた後、私はこのようなページのURLを修正するために変換されていないアンカータグからhref一部を発見しました~/フォーマットをリード相対URLのパスを変換し、したがって相対URLの一部がHtmlHelperクラスからViewContext.RequestContext現在含まUrlHelper.Content()方法で変換する必要があり(@Curtisにクレジット買収):

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 Method

(MSDN)

In ASP.NET MVC how can I use the Razor @Url.Content() helper from C# code?

+0

完全に動作します。ありがとうございました。 – Neill

関連する問題