Asp.net mvc 3 如何从局部视图将JavaScript呈现到MasterLayout部分?

Asp.net mvc 3 如何从局部视图将JavaScript呈现到MasterLayout部分?,asp.net-mvc-3,c#-4.0,razor,Asp.net Mvc 3,C# 4.0,Razor,考虑到MVC3和Razor引擎,我得到了 \u MasterLayout.cshtml @RenderSection("JavaScript", required: false) .. .. @RenderBody() .. .. @section JavaScript { ........ } .. View.cshtml在_ViewStart.cshtml中定义了_MasterLayout.cshtml .. @Html.RenderAction("PartialView", "Part

考虑到MVC3和Razor引擎,我得到了

\u MasterLayout.cshtml

@RenderSection("JavaScript", required: false)
..
..
@RenderBody()
..
..
@section JavaScript
{
........
}
..
View.cshtml在_ViewStart.cshtml中定义了_MasterLayout.cshtml

..
@Html.RenderAction("PartialView", "PartialController")
..
PartialView.cshtml

@RenderSection("JavaScript", required: false)
..
..
@RenderBody()
..
..
@section JavaScript
{
........
}
..
如何确保来自部分视图的JavaScript最终出现在主布局部分

编辑
上述场景不起作用,因为局部视图没有定义主布局。另一方面,视图确实具有定义了RenderSection的布局。如果我将部分JavaScript从一个视图移动到另一个视图,Razor知道将其渲染到哪里。但是,由于局部视图没有布局,它不知道如何处理节JavaScript,因此不会在任何地方呈现它。

我不相信局部视图可以设置要在布局页面中使用的节:(

看起来没有很好的解决方案-您可以包括两个部分(一个用于脚本,一个用于内容):


@RenderAction(“PartialViewScript”、“PartialController”)
@RenderAction(“PartialView”、“PartialController”)

我创建了一组扩展方法,用于将脚本块(或任何内容)从局部渲染到主布局中

public static class ViewPageExtensions
{  
 private const string SCRIPTBLOCK_BUILDER = "ScriptBlockBuilder";

    public static MvcHtmlString ScriptBlock(
        this WebViewPage webPage,
        Func<dynamic, HelperResult> template)
    {
        if (!webPage.IsAjax)
        {
            var scriptBuilder = webPage.Context.Items[SCRIPTBLOCK_BUILDER] 
                                as StringBuilder ?? new StringBuilder();

            scriptBuilder.Append(template(null).ToHtmlString());

            webPage.Context.Items[SCRIPTBLOCK_BUILDER] = scriptBuilder;

            return new MvcHtmlString(string.Empty);
        }
        return new MvcHtmlString(template(null).ToHtmlString());
    }

    public static MvcHtmlString WriteScriptBlocks(this WebViewPage webPage)
    {
        var scriptBuilder = webPage.Context.Items[SCRIPTBLOCK_BUILDER] 
                            as StringBuilder ?? new StringBuilder();

        return new MvcHtmlString(scriptBuilder.ToString());
    }
}
在这里查看全文:

这对我来说很有效,允许我将javascript和html放在同一个文件中进行局部查看,以便于阅读 在使用名为“\u MyPartialView.cshtml”的局部视图的视图中

@Html.Partial(“\u MyPartialView”,,
新的ViewDataDictionary{{“区域”,“HTMLSection”}})
@节脚本{
@Html.Partial(“\u MyPartialView”,,
新ViewDataDictionary{{“区域”、“脚本节”})
}

在局部视图文件中
@modelsometype
@{
var region=ViewData[“region”]作为字符串;
}
@如果(区域==“HTMLSection”)
{
}
@如果(区域==“脚本节”)
{

我不明白这个问题-这不起作用吗?如果不起作用,为什么不起作用?是否有错误?RenderSection()是否“被什么都不替换?”Danny Tuppeny-我在问题中添加了编辑,让我知道这是否有意义。谢谢。几周前我问了类似的问题:视图中是否会有这样的内容。cshtml?没错,是的。你需要在PartialController上执行两个操作-一个用于视图,一个用于脚本。这不是特别好,但我不能现在想一个更好的办法:(是的,我在等待答案的时候也在考虑类似的方法。基本上,我在视图内部有一个条件。如果是真的,我会渲染部分。我只是将js部分添加到该条件的内部,而不只是为js创建第二个部分视图。谢谢你的回答。一个好答案的标志不仅仅是链接到一篇你自己承认“消失”了一段时间的文章。为什么不总结这篇文章并加入代码示例,这样如果链接再次失败,未来的用户就不会被蒙在鼓里。另外,在发布多个问题的复制粘贴样板/逐字回答时要小心,这些问题往往会被标记为“垃圾邮件”由社区提供。感谢您的反馈。我将添加您提到的详细信息。我非常喜欢您的想法。谢谢!您如何管理呈现顺序?我的意思是,如果一些
ScriptBlock
调用发生在
WriteScriptBlocks
调用之后呢?如果页面呈现时没有布局,例如作为部分请求,会发生什么t来自客户端代码
@this.WriteScriptBlocks()
<div>
    @Html.Partial("_MyPartialView",< model for partial view>,
            new ViewDataDictionary { { "Region", "HTMLSection" } } })
</div>

@section scripts{

    @Html.Partial("_MyPartialView",<model for partial view>, 
                  new ViewDataDictionary { { "Region", "ScriptSection" } })

 }
@model SomeType

@{
    var region = ViewData["Region"] as string;
}

@if (region == "HTMLSection")
{


}

@if (region == "ScriptSection")
{
        <script type="text/javascript">
    </script">
}