Asp.net 如何在MVC4的局部视图中添加脚本?
这是我的部分观点中的代码Asp.net 如何在MVC4的局部视图中添加脚本?,asp.net,asp.net-mvc,razor,asp.net-mvc-4,razor-2,Asp.net,Asp.net Mvc,Razor,Asp.net Mvc 4,Razor 2,这是我的部分观点中的代码 @model Contoso.MvcApplication.Models.Exercises.AbsoluteArithmetic @using(Html.BeginForm()) { <div> <span style="width: 110px; float:left; text-align:center; font-size:2.5em;">@Model.Number1</span> <span styl
@model Contoso.MvcApplication.Models.Exercises.AbsoluteArithmetic
@using(Html.BeginForm())
{
<div>
<span style="width: 110px; float:left; text-align:center; font-size:2.5em;">@Model.Number1</span>
<span style="width: 110px; float:left; text-align:center; font-size:2.5em;">+</span>
<span style="width: 110px; float:left; text-align:center; font-size:2.5em;">@Model.Number2</span>
<span style="width: 110px; float:left; text-align:center; font-size:2.5em;">=</span>
<span>
@Html.EditorFor(model => model.Result)
@Html.ValidationMessageFor(model => model.Result)
</span>
</div>
}
@section Scripts {
@Scripts.Render("~/bundles/jqueryval")
}
@model Contoso.mvcapapplication.Models.Exercises.absolute算法
@使用(Html.BeginForm())
{
@型号1
+
@型号2
=
@EditorFor(model=>model.Result)
@Html.ValidationMessageFor(model=>model.Result)
}
@节脚本{
@Scripts.Render(“~/bundles/jqueryval”)
}
请注意,在我的代码底部,我有一个@部分
,我意识到如果我在那里设置断点,它就不会运行。如果我在_Layout.cshtml中移动这一行,效果会很好,但这不是我的想法
如何在局部razor视图中告诉MVC4我要添加该库?不能从局部视图渲染布局部分。将节定义移动到父页面或布局。查看我的答案,它允许您在任何视图/局部视图中定义脚本和样式。它还负责复制包含 我个人的看法是,对于样式和javascript包含,节不是一个好的解决方案。您可以使用
@Scripts.Render(“~/Scripts/my script.js”)
用于.js文件,而@Styles.Render(“~/Content/my Stylesheet.css”)
用于css文件
注意:它适用于特定的捆绑包,也适用于更详细的信息-“”
它适用于razor中的任何子页面,包括部分视图。
有关使用这些帮助程序的更多信息,请访问谷歌对于此问题没有通用的解决方案,但您可以使用以下最简单的方法: 1) 您可以创建一组扩展方法,如下所示:
{
// markup and razor code for Main View here
@Html.Partial("Main_PartialView")
}
@section Scripts
{
@Html.Partial("JavaScript_PartialView")
}
2) 只需将javascript代码移动到单独的部分视图中,然后在主视图上呈现2个部分视图。一个用于主局部视图,另一个用于脚本,如下所示:
{
// markup and razor code for Main View here
@Html.Partial("Main_PartialView")
}
@section Scripts
{
@Html.Partial("JavaScript_PartialView")
}
希望能有所帮助。这对我来说很有效,允许我在同一个文件中对JavaScript和HTML进行部分视图的合并,以便于阅读 在使用名为“\u MyPartialView.cshtml”的局部视图的视图中
@Html.Partial(“\u MyPartialView”,,
新的ViewDataDictionary{{“区域”,“HTMLSection”}})
@节脚本{
@Html.Partial(“\u MyPartialView”,,
新ViewDataDictionary{{“区域”、“脚本节”})
}
在局部视图文件中
@model SomeType
@{
var region = ViewData["Region"] as string;
}
@if (region == "HTMLSection")
{
}
@if (region == "ScriptSection")
{
<script type="text/javascript">
</script">
}
@modelsometype
@{
var region=ViewData[“region”]作为字符串;
}
@如果(区域==“HTMLSection”)
{
}
@如果(区域==“脚本节”)
{
此Stackoverflow页面提供了此问题的完整解决方案:
TL;DR:只需将Forloop.HtmlHelpers nuget包添加到您的项目中,就可以从ASP.NET MVC中的Razor部分视图和模板运行Javascript。我个人在我的MVC 5项目中使用了这一点。您可以直接在部分视图html末尾添加脚本,而无需脚本部分(因为脚本部分不在局部视图中渲染)
//你的脚本在这里
// ....
如果您希望仅在某些局部视图中包含特定脚本,并避免在整个应用程序中不必要地传播它们,您可以执行以下操作:
在BundleConfig.cs
中定义一个指向空javascript文件的捆绑包:
bundles.Add(new ScriptBundle("~/bundles/empty").Include(
"~/Scripts/empty.js"
));
在\u Layout.cshtml
的标题部分,添加以下变量:
@{
ViewBag.AdditionalBundle = String.IsNullOrEmpty(ViewBag.AdditionalBundle) ? "~/bundles/empty" : ViewBag.AdditionalBundle;
}
ViewBag.AdditionalBundle = "~/bundles/mySpecificBundle";
在\u Layout.cshtml
的底部,呈现所需的任何其他捆绑包:
@Scripts.Render("~/bundles/lib")
@Scripts.Render(@ViewBag.AdditionalBundle);
@RenderSection("scripts", required: false)
最后,在需要任何特定脚本的局部视图中,只需将相应的包添加到变量:
@{
ViewBag.AdditionalBundle = String.IsNullOrEmpty(ViewBag.AdditionalBundle) ? "~/bundles/empty" : ViewBag.AdditionalBundle;
}
ViewBag.AdditionalBundle = "~/bundles/mySpecificBundle";
局部视图在\u Layout.cshtml
之前呈现,因此您需要在文件顶部进行验证。它是这样的:如果任何局部视图为ViewBag.AdditionalBundle
指定了一个值,则使用它。否则,呈现一个空脚本。Noob技巧:在已加载的文件中定义一个函数,并调用函数局部视图加载时的操作
1.有一个单独的js文件,与您的常用捆绑包一起加载:
捆绑图
像加载布局中的任何其他捆绑包一样加载自定义脚本捆绑包
_Layout.cshtml
定义一个函数,在我们的例子中,自定义js文件中的OnPartialViewLoad函数:
partial-view.js
在局部视图的末尾添加document.ready()函数,并调用onload函数
partialView.cshtml
$(文档).ready(函数(){
OnPartialViewLoad();
});
我们无法将脚本添加到部分视图。但将脚本添加到视图将解决您的问题。请查看我的答案。我们可以将与部分视图相关的脚本动态添加到容器视图中。希望这将解决您的问题。我知道问题是关于MVC4的,但您现在可以在MVC5中执行此操作;请参阅,但情况如何当通过ajax调用调用部分视图并且它必须包含某些特定的js库和样式时,这是可行的,但是如果以这种方式包含的脚本依赖于其他脚本(例如jQuery、Bootstrap)它们包含在父页面的@部分
中,如果在其依赖项之前呈现,则它们可能无法工作。我只是精确地回答了这个问题。通常,父页面中的脚本在加载子页面中的脚本之前加载。无论如何,必须确保在加载依赖项之前加载。@PhilipStratford Do你有一个提议,我的意思是,以代码的形式,来解决你提出的问题?为什么这不是一个好的解决方案?你会建议什么?直接包括脚本?这正是我的问题所在。它在一个大括号的脚本标签中,被忽略了。
@Scripts.Render("~/bundles/CustomScripts");
function OnPartialViewLoad() {
// ... your onLoad work
}
<script type="text/javascript">
$(document).ready(function(){
OnPartialViewLoad();
});
</script>