0

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

我知道我可以通过additionalViewData参数将视图中的日期传递给模板.EditorFor().DisplayFor()但是我想要从模板返回数据!

Date.cshtml在我的~/Views/Shared/EditorTemplates/. 我的模型属性已经有这样的东西:

public class Person
{
    [DisplayFormat(DataFormatString = "{0:d}")]
    [DataType(DataType.Date)]
    public Nullable<DateTime> BirthDate { get; set; }
}

和观点:

@Html.EditorFor(model => model.BirthDate)

现在我只想在视图使用日期模板时加载 datepicker 脚本。所以我尝试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;}

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

  1. 捆绑"~/bundles/jqueryui"那个

    • 从中删除 jquery ui 日期选择器功能(并移至"~/bundles/jqueryui-datepicker"
    • 包括Modernizr.inputtypes.date检查并Modernizr.load加载"~/bundles/jqueryui-datepicker"
  2. 无需修改_layout.cshtml即可检查RequireDatePicker. @Scripts.Render("~/bundles/jquery")并且已经包含@Scripts.Render("~/bundles/jqueryui")了足够的正弦波。Modernizr.load

  3. 无需传递RequireDatePickerfrom Date.cshtmlto view 或 _Layout.cshtml asModernizr.load

4

1 回答 1

0

您可以创建动态 javascript 包,如下文所述

http://neimke.blogspot.co.nz/2011/12/composing-child-views-with-bundles.html

基本上你的编辑器模板调用以下代码

@{
  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 的子句。

如果您想发疯,您可能会扩展 razor 视图引擎或 WebViewPage 以查找与呈现的每个视图匹配的 View.cshtml.js 并将其添加到包中。

于 2012-10-19T03:09:14.157 回答