我厌倦了谷歌,并没有找到确切的答案。
我知道我可以通过additionalViewData
或.EditorFor()
的{{1}}参数将日期从视图传递到模板,但我希望从模板返回数据!
我的.DisplayFor()
中有Date.cshtml
。
我的模型属性已经有这样的东西:
~/Views/Shared/EditorTemplates/
和视图:
public class Person
{
[DisplayFormat(DataFormatString = "{0:d}")]
[DataType(DataType.Date)]
public Nullable<DateTime> BirthDate { get; set; }
}
现在我只想在视图使用日期模板时加载datepicker脚本。
所以我尝试在我的模板中使用@Html.EditorFor(model => model.BirthDate)
这样的内容:
RequireDatePicker
位于@model DateTime?
@Html.TextBox(...)
@{ViewBag.RequireDatePicker = true;}
的底部:
_Layout.cshtml
问题是我只是意识到 @Scripts.Render("~/bundles/jquery")
@if (ViewBag.RequireDatePicker == true)
{
<script type="text/javascript">
if (!Modernizr.inputtypes.date) {
// Todo: use Modernizr.load
$(function () {
$("input[type='date']").datepicker();
});
}
</script>
}
/ ViewBag
具有与视图/部分和显示/编辑器模板不同的上下文。这样做的最佳方式是什么?
修正 我可以通过路径数据将模板中的数据传回视图:
ViewData
但是我最终没有传递数据,只是这样:
将@{ViewContext.RouteData.DataToken["requireDatePicker"] = true;}
捆绑为
"~/bundles/jqueryui"
)"~/bundles/jqueryui-datepicker"
支票和Modernizr.inputtypes.date
以加载Modernizr.load
无需修改"~/bundles/jqueryui-datepicker"
来检查_layout.cshtml
。 RequireDatePicker
和@Scripts.Render("~/bundles/jquery")
已经包含了足够的sinec @Scripts.Render("~/bundles/jqueryui")
。
无需将Modernizr.load
从RequireDatePicker
传递给Date.cshtml
答案 0 :(得分:0)
您可以创建动态javascript包,如下文所述
http://neimke.blogspot.co.nz/2011/12/composing-child-views-with-bundles.html
基本上你的editorfor模板调用以下代码
@{
var bundle = Microsoft.Web.Optimization.BundleTable.Bundles.GetRegisteredBundles()
.Where(b => b.TransformType == typeof(Microsoft.Web.Optimization.JsMinify))
.First();
bundle.AddFile("~/Scripts/DatePicker.js");
}
但您可能希望将Where子句替换为找到特定包的那个,也就是说包含用于子视图的javascript的一个。
如果您想坚持下去,您可以扩展剃刀视图引擎或WebViewPage以查找匹配的View.cshtml.js到每个呈现的视图并将其添加到包中。