ASP.NET 5/MVC 6 を使用しています。ページの最後までスクリプト タグのレンダリングを遅らせることができるように、部分ページ内でカスタム HtmlHelper を使用してスクリプト タグを HttpContext に登録しています。
このコードはスクリプト タグを登録します。
public static HtmlString AddResource(this IHtmlHelper HtmlHelper, PageResourceType resourceType, Func<object, HelperResult> Template)
{
if (HtmlHelper.ViewContext.HttpContext.Items[resourceType] != null)
{
((List<Func<object, HelperResult>>)HtmlHelper.ViewContext.HttpContext.Items[resourceType]).Add(Template);
}
else
{
HtmlHelper.ViewContext.HttpContext.Items[resourceType] = new List<Func<object, HelperResult>>() { Template };
}
return new HtmlString(String.Empty);
}
このヘルパーを使用して Razor ページからスクリプト タグを登録するための使用法は次のとおりです。
@Html.AddResource(PageResourceType.JavaScript ,
@<script src='~/js/plugin/sparkline/jquery.sparkline.js'></script>
)
_Layout.cshtml から呼び出されるこのコードは、登録されているすべてのスクリプト タグをレンダリングします。
public static HtmlString RenderResources(this IHtmlHelper HtmlHelper, PageResourceType resourceType)
{
if (HtmlHelper.ViewContext.HttpContext.Items[resourceType] != null)
{
List<Func<object, HelperResult>> Resources = (List<Func<object, HelperResult>>)HtmlHelper.ViewContext.HttpContext.Items[resourceType];
foreach (var Resource in Resources)
{
if (Resource != null)
{
HtmlHelper.ViewContext.Writer.Write(Resource(null));
}
}
}
return new HtmlString(String.Empty);
}
これら 2 つの部分はうまく機能しますが、スクリプト タグに依存する特定の UI 要素 (この場合は Sparkline UI ウィジェット) を作成するために使用する HtmlHelper が追加されました。
public static HtmlString Sparkline(this IHtmlHelper HtmlHelper, IEnumerable<int> values, string cssClasses)
{
StringBuilder sb = new StringBuilder();
sb.Append("<div class='sparkline txt-color-blue hidden-mobile hidden-md hidden-sm'>");
sb.Append(string.Join(",", values));
sb.Append("</div>");
HtmlHelper.AddResource(PageResourceType.JavaScript, (x) =>
{
return new HelperResult(writer =>
{
string script = "<script src='~/js/plugin/sparkline/jquery.sparkline.js'></script>";
return new Task(() => writer.Write(script));
});
});
return new HtmlString(sb.ToString());
}
を介して前の登録メソッドを呼び出すことに注意してください。
HtmlHelper.AddResource
問題は、RenderResources コードを実行すると、アプリが無期限にハングすることです。私はこれを古い MVC 5 システムで動作させていましたが、新しい MVC 6 構成を考慮していくつかの変更を加える必要があり (タグ ヘルパーが変更の原因だと思います)、どうにかして失敗しました。
Sparkline メソッド、特に HtmlHelper.AddResource の呼び出しを適切に実装する方法はありますか?
ティア!