Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将变量从EditorTemplate传递回页面或布局_C#_Asp.net Mvc_Razor_Viewbag - Fatal编程技术网

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

C# 将变量从EditorTemplate传递回页面或布局,c#,asp.net-mvc,razor,viewbag,C#,Asp.net Mvc,Razor,Viewbag,我厌倦了到处搜索,但没有找到确切的答案 我知道我可以通过additionalViewData参数.EditorFor()或.DisplayFor()将日期从视图传递到模板,但我希望从模板返回数据 我的~/Views/Shared/EditorTemplates/中有Date.cshtml。 “我的模型”属性已具有以下内容: public class Person { [DisplayFormat(DataFormatString = "{0:d}")] [DataType(Dat

我厌倦了到处搜索,但没有找到确切的答案

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

我的
~/Views/Shared/EditorTemplates/
中有
Date.cshtml
。 “我的模型”属性已具有以下内容:

public class Person
{
    [DisplayFormat(DataFormatString = "{0:d}")]
    [DataType(DataType.Date)]
    public Nullable<DateTime> BirthDate { get; set; }
}
@{ViewContext.RouteData.DataToken["requireDatePicker"] = true;}
现在,我只想在视图使用日期模板时加载datepicker脚本。 因此,我尝试在我的模板中使用
RequireDatePicker

@model DateTime?
@Html.TextBox(...)
@{ViewBag.RequireDatePicker = true;}
\u 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>
    }
但是,我最终没有传递数据,只传递了以下内容:

  • 让bundle
    “~/bundles/jqueryui”
    知道

    • 从中删除jquery ui日期选择器功能(并移动到
      “~/bundles/jqueryui日期选择器”
    • 包括一个
      modernizer.inputtypes.date
      检查和
      modernizer.load
      加载
      “~/bundles/jqueryui日期选择器”
  • 无需修改
    \u layout.cshtml
    来检查
    所需的数据选择器
    @Scripts.Render(“~/bundles/jquery”)
    @Scripts.Render(“~/bundles/jqueryui”)
    足够了。已包括加载

  • 无需通过
    Date.cshtml
    中的
    RequireDatePicker
    来查看或将Layout.cshtml作为
    modernizer.load


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

    基本上,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的子句


    如果你想发疯,你可能会扩展razor视图引擎或WebViewPage,在呈现的每个视图中查找匹配的view.cshtml.js,并将其添加到一个bundle中。

    与bundle功能结合起来似乎是一个不错的解决方案,但我没有使用HTML5浏览器的原生日期选择器。还有一件事要考虑的是,为<代码>“~/捆绑/ jQuyYi”< /COD>缓存捆绑的文件。我认为捆绑脚本的内容对于一个URL应该是相同的。将其放入特定于页面的新捆绑包中,而不是jqueryui捆绑包。我不相信你能马上创建一个新的包。您不应该丢失HTML5浏览器原生日期选择器,您应该仍然能够进行Modernizer检查。实际上,动态添加新的捆绑包是可行的,但您是对的,它不受支持,也不是以这种方式设计的。我听说,由于web场的支持,捆绑只能在应用程序启动时创建。我已经更新了关于我做了什么的问题。
    @{
      var bundle = Microsoft.Web.Optimization.BundleTable.Bundles.GetRegisteredBundles()
        .Where(b => b.TransformType == typeof(Microsoft.Web.Optimization.JsMinify))
        .First();
    
      bundle.AddFile("~/Scripts/DatePicker.js");
    }