3

我编写了以下 EditorTemplate,它大致基于其他一些 SO 问题和 Google 结果:

@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 文件并在我的页面上引用它。这并不是非常困难或任何事情,但我希望有一个解决方案,它会更多一点......无缝/神奇(为什么?有趣,它会很整洁,只是因为......)。有任何想法吗?

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 回答