asp.netのhtml.actionlink()メソッドの拡張メソッドを作成することができますか?
-
27-09-2019 - |
質問
今、私はIE6/7のバグを回避しようとしています。 </a>
この具体的なコメントでタグを閉じて、ドロップダウンメニューを機能させるには:
<!--[if IE 7]><!--></a><!--<![endif]-->
残念ながら、このようなビューページコードにこれを直接注入することはできません。
<%= Html.ActionLink("LinkName<!--[if IE 7]><!--></a><!--<![endif]-->","Action","Controller") %>
html.actionlinkが安全なことを行い、コメントを除外して、JavaScriptインジェクション攻撃を防ぐためにコメントを除外します。うんいいね。私はそれで大丈夫です。良いデザインの決定。
私がやりたいのは、これに拡張方法を書くことですが、これをやったことがないので、プロセスは私を避けています。
私はこれがうまくいくと思ったが、Intellisenseは私が書いたこの拡張方法を拾っていないようだ。
public static class MyLinkExtensions
{
public static string ActionLinkIE(this HtmlHelper htmlHelper,
string linkText, string actionName, string controllerName)
{
return LinkExtensions.ActionLink(htmlHelper, linkText, actionName, controllerName).
Replace(@"</a>", @"<!--[if IE 7]><!--></a><!--<![endif]-->");
}
}
助言がありますか?
編集: クラス名は重要ですか? (私の場合、私はそれをmylinkextensionsと呼んでいます)
また、整理するとき <%= Html.ActionLink() %>
これはすでに拡張メソッドのようです。拡張メソッドを拡張できますか?
解決
おそらく、extensions namespaceをweb.configに配置する必要があります。
<pages>
<namespaces>
<add namespace="System.Web.Mvc" />
<add namespace="System.Web.Mvc.Html" />
<add namespace="System.Web.Routing" />
<add namespace="System.Linq" />
<add namespace="Pretzel.Extensions.Html" />
</namespaces>
</pages>
それはIntellisenseに役立つはずです。
他のヒント
Phil Haackのこの投稿に従って、出力をエンコードするためにライブラリを変更できますhttp://haacked.com/archive/2010/04/06/using-antixss-as-the-default-encoder-for-asp-net.aspx
これにより、Antixsを使用する機会が与えられます http://wpl.codeplex.com/. 。マイクロソフトの図書館です。
- JavaScriptEncoding
- ホワイトリストによるエンコード
AjaxとJavaScriptを使用するほぼすべてのアプリケーションは、とにかくJavaScriptEncodingが必要なので、このライブラリなしで行く機会はないと思います。
ヘルパーがこのライブラリを使用している場合、タグをホワイトリストに追加するだけで、準備ができています。
編集
ページで、これが既存のHTMLヘルパーで動作しないことを見ました:-(。さて、MVC3までこの投稿を保持します。