将变量从EditorTemplate传递回页面或布局

时间:2012-10-19 00:42:41

标签: c# asp.net-mvc razor viewbag

我厌倦了谷歌,并没有找到确切的答案。

我知道我可以通过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

但是我最终没有传递数据,只是这样:

  1. @{ViewContext.RouteData.DataToken["requireDatePicker"] = true;} 捆绑为

    • 从中移除jquery ui日期选择器功能(并移至"~/bundles/jqueryui"
    • 包含"~/bundles/jqueryui-datepicker"支票和Modernizr.inputtypes.date以加载Modernizr.load
  2. 无需修改"~/bundles/jqueryui-datepicker"来检查_layout.cshtmlRequireDatePicker@Scripts.Render("~/bundles/jquery")已经包含了足够的sinec @Scripts.Render("~/bundles/jqueryui")

  3. 无需将Modernizr.loadRequireDatePicker传递给Date.cshtml

  4. 查看或_Layout.cshtml

1 个答案:

答案 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到每个呈现的视图并将其添加到包中。