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>