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>
}
但是,我最终没有传递数据,只传递了以下内容:
“~/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");
}