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