2

部分ビューを使用して、ASP.NETMVCアプリケーションのツールチップのHTMLを保存しています。私の最初の考えは、RazorがHTMLの引用符の間にあるものを自動的に属性エンコードするというものでした。残念ながら、これは当てはまらないようです。そのため、現時点での回避策は、一重引用符を使用してPartialViewsHTMLをカプセル化することです。以下のように:

<div class="tooltip" title='@Html.Partial("_MyTooltipInAPartial")'>Some content</div>

これはダンディに機能しますが、PartialView内に単一引用符がある場合は明らかに問題があります。

誰かがこれを解決するための適切なアプローチを知っていますか?私が持っている最も近いものは以下です:

<div class="tooltip" title="@HttpUtility.HtmlAttributeEncode(Html.Partial("_MyTooltipInAPartial"))">Some content</div>

残念ながら、Partialの出力はストレート文字列ではなくMvcHtmlStringであるため、これは完全には機能しません。

誰かもっと良いアイデアがありますか?

4

1 に答える 1

2

提案をしてくれたnemesvに感謝します-それはうまくいきませんでした。少し熟考した後、私は.と呼ばれるHTMLヘルパーメソッドを書くことによって自分のかゆみを掻くことになりましたPartialAttributeEncoded

興味のある方のために、ヘルパーの使い方は次のとおりです。

<div class="tooltip" title="@Html.PartialAttributeEncoded("_MyTooltipInAPartial")">Some content</div>

そして、ここにヘルパーがあります:

using System.Web;
using System.Web.Mvc;
using System.Web.Mvc.Html;

namespace My.Helpers
{
    /// <summary>
    /// MVC HtmlHelper extension methods - html element extensions
    /// </summary>
    public static class PartialExtensions
    {
        /// <summary>
        /// Allows a partial to be rendered within quotation marks.
        /// I use this with jQuery tooltips where we store the tooltip HMTL within a partial.
        /// See example usage below:
        /// <div class="tooltip" title="@Html.PartialAttributeEncoded("_MyTooltipInAPartial")">Some content</div>
        /// </summary>
        /// <param name="helper"></param>
        /// <param name="partialViewName"></param>
        /// <param name="model"></param>
        /// <returns></returns>
        public static MvcHtmlString PartialAttributeEncoded(
          this HtmlHelper helper,
          string partialViewName,
          object model = null
        )
        {
            //Create partial using the relevant overload (only implemented ones I used)
            var partialString = (model == null)
                ? helper.Partial(partialViewName)
                : helper.Partial(partialViewName, model);

            //Attribute encode the partial string - note that we have to .ToString() this to get back from an MvcHtmlString
            var partialStringAttributeEncoded = HttpUtility.HtmlAttributeEncode(partialString.ToString());

            //Turn this back into an MvcHtmlString
            var partialMvcStringAttributeEncoded = MvcHtmlString.Create(partialStringAttributeEncoded);

            return partialMvcStringAttributeEncoded;
        }
    }
}
于 2012-08-24T10:55:27.867 に答える