如何避免在此EditorTemplate中放置javascript?

时间:2013-01-18 19:22:51

标签: javascript asp.net-mvc razor asp.net-mvc-4 razor-2

我编写了以下EditorTemplate,它基于其他一些SO问题和谷歌搜索结果:

@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下面写下来。我理解为什么,我知道一个可能的解决方案是将脚本放入.js文件并在我的页面上引用它。这不是特别困难或任何事情,但我希望有一个解决方案会更多......无缝/魔术(为什么?有趣,它很整洁,只是因为......)。有什么想法吗?

1 个答案:

答案 0 :(得分: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文档的末尾呈现为脚本标记。< / p>