【问题标题】:Pass variable back from EditorTemplate to page or layout将变量从 EditorTemplate 传回页面或布局
【发布时间】:2012-10-19 00:42:40
【问题描述】:

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

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

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

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. 无需将RequireDatePickerDate.cshtml 传递给查看或_Layout.cshtml 作为Modernizr.load

【问题讨论】:

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


    【解决方案1】:

    您可以创建动态 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 并将其添加到包中。

    【讨论】:

    • 似乎是结合捆绑功能的不错解决方案,但我失去了 HTML5 浏览器原生日期选择器。要考虑的另一件事是缓存"~/bundles/jqueryui" 的捆绑文件。我认为捆绑脚本的内容对于一个 URL 应该是相同的。
    • 将其放入特定于页面的新捆绑包中,而不是 jqueryui 捆绑包中。我不相信您可以即时创建新捆绑包。您不应该丢失 HTML5 浏览器本机日期选择器,您应该仍然能够进行modernizr 检查。
    • 实际上是在运行中添加新包,但你是对的,它不受支持,也不应该以这种方式设计。我在某处听说过,因为网络农场支持和捆绑应该只在应用程序启动时创建。我已经更新了关于我做了什么的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-19
    • 2021-08-30
    • 1970-01-01
    相关资源
    最近更新 更多