如何从局部视图将JavaScript呈现到MasterLayout部分?

时间:2011-05-12 16:45:33

标签: asp.net-mvc-3 c#-4.0 razor

鉴于MVC3和Razor引擎,我得到了

_MasterLayout.cshtml

@RenderSection("JavaScript", required: false)
..
..
@RenderBody()
..
使用_ViewStart.cshtml中定义的_MasterLayout.cshtml

View.cshtml

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

PartialView.cshtml

..
@section JavaScript
{
........
}
..

如何确保部分视图中的JavaScript最终在主版面部分?

修改

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

3 个答案:

答案 0 :(得分:20)

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

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());
    }
}

然后就可以这样使用:

@this.ScriptBlock(
@<script  type='text/javascript'>
    $(document).ready(function () {
        notify('@message', '@Model.Type.ToString()',                    
               '@Model.Type.ToString().ToLower()');
    });
</script>)

然后在主布局中渲染:

@this.WriteScriptBlocks()

点击此处查看完整文章:A Script-Block Templated Delegate for Inline-Scripts in Razor Partials

答案 1 :(得分:7)

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

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

<script stuff>
@Html.RenderAction("PartialViewScripts", "PartialController")
</script stuff>
<body stuff>
@Html.RenderAction("PartialView", "PartialController")
</body stuff>

答案 2 :(得分:0)

这对我有用,允许我在同一个文件中共同查找javascript和html部分视图以便于阅读

在View中使用名为“_MyPartialView.cshtml”的部分视图

<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">
}