1

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 の呼び出しを適切に実装する方法はありますか?

ティア!

4

1 に答える 1

0

もちろん、質問を投稿した瞬間に答えが見つかります。ただし、 Task 内で .Write メソッドをラップすることは .WriteAsync を呼び出すことと同じであると想定していたため、問題が修正される理由はわかりません...

    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));
        });
    });

する必要があります

    HtmlHelper.AddResource(PageResourceType.JavaScript, (x) =>
    {
        return new HelperResult(writer =>
        {
            string script = "<script src='~/js/plugin/sparkline/jquery.sparkline.js'></script>";
            return writer.WriteAsync(script);
        });
    });
于 2015-12-02T19:01:15.220 に答える