3

他の SO の質問と Google の結果に大まかに基づいた次の EditorTemplate を作成しました。

@model Nullable<DateTime>
@{
    var metadata = ModelMetadata.FromStringExpression("", ViewData);
    string value;
    if(!String.IsNullOrEmpty(metadata.EditFormatString)) {
        if(Model.HasValue) {
            value = String.Format(metadata.EditFormatString, Model.Value);
        }
        else {
            value = metadata.NullDisplayText;
        }
    }
    else {
        value = Model.ToString();
    }
}
@Html.TextBox("", value, new { @class = "textBoxDate" })
<script type ="text/javascript">
    $(document).ready(function () {
        $('.textBoxDate').datepicker();
    });
</script>

私が気に入らないのは、スクリプトがすべての下に書かれていることtextBoxDateです。私はその理由を理解しており、考えられる解決策の 1 つは、スクリプトを .js ファイルにドロップして自分のページで参照することであることを知っています。それはそれほど難しいことでも何でもありませんが、もう少し... シームレス/魔法のような解決策があることを望んでいました(なぜですか?楽しい、それはきちんとしているからです..)。何か案は?

4

1 に答える 1

3

スクリプトを .js ファイルにドロップし、それをページで参照することが、この問題に対する最も楽しくて適切なアプローチだと思います。

あまりきちんとしたソリューションを探していない場合は、いくつかの HtmlHelper 拡張機能を追加して、テンプレート エンジンが検出したときにレジスタ依存関係を追加し、ページの最後に多数のスクリプト タグを出力することができます。

private const string requiredJavascriptIncludesContextItemsKey = "requiredJavascriptIncludesContextItemsKey";

public static void Require(this HtmlHelper html, string src)
{
    var collection = (HashSet<string>) html.ViewContext.HttpContext.Items[requiredJavascriptIncludesContextItemsKey] ?? new HashSet<string>();
    collection.Add(src);
    html.ViewContext.HttpContext.Items[requiredJavascriptIncludesContextItemsKey] = collection;
}

public static HtmlString RequiredJavascriptIncludes(this HtmlHelper html)
{
    var sb = new StringBuilder();
    foreach (var src in (HashSet<string>) html.ViewContext.HttpContext.Items[requiredJavascriptIncludesContextItemsKey] ?? new HashSet<string>())
    {
        sb.Append(string.Format("<script type='text/javascript' src='{0}></script>", src));
    }

    return new HtmlString(sb.ToString());
}

@Html.Requireこのメソッドは、任意のテンプレート内で呼び出すことができます。あなたの場合、次のようになります。

@model Nullable<DateTime>
@{
    var metadata = ModelMetadata.FromStringExpression("", ViewData);
    string value;
    if(!String.IsNullOrEmpty(metadata.EditFormatString)) {
        if(Model.HasValue) {
            value = String.Format(metadata.EditFormatString, Model.Value);
        }
        else {
            value = metadata.NullDisplayText;
        }
    }
    else {
        value = Model.ToString();
    }
}
@Html.TextBox("", value, new { @class = "textBoxDate" })
@Html.Require(Html.Content("scripts/datepicker.js"))

次に、ベース テンプレート ページの下部で を呼び出し@Html.RequiredJavascriptIncludes()ます。登録したすべての js 依存関係が、html ドキュメントの最後にスクリプト タグとしてレンダリングされます。

于 2013-01-18T21:16:23.710 に答える