首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何从局部视图将JavaScript渲染成MasterLayout部分?

如何从局部视图将JavaScript渲染成MasterLayout部分?
EN

Stack Overflow用户
提问于 2011-05-13 00:45:33
回答 3查看 22.5K关注 0票数 20

有了MVC3和剃刀引擎,我得到了

_MasterLayout.cshtml

代码语言:javascript
复制
@RenderSection("JavaScript", required: false)
..
..
@RenderBody()
..

带有在_ViewStart.cshtml中定义的_MasterLayout.cshtml的View.cshtml

代码语言:javascript
复制
..
@Html.RenderAction("PartialView", "PartialController")
..

PartialView.cshtml

代码语言:javascript
复制
..
@section JavaScript
{
........
}
..

如何确保部分视图中的JavaScript最终显示在主布局部分?

编辑

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-05-13 01:13:22

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

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

代码语言:javascript
复制
<script stuff>
@Html.RenderAction("PartialViewScripts", "PartialController")
</script stuff>
<body stuff>
@Html.RenderAction("PartialView", "PartialController")
</body stuff>
票数 7
EN

Stack Overflow用户

发布于 2011-07-13 06:05:26

我创建了一组扩展方法来将脚本块(或任何内容)从部分呈现到主布局中。

代码语言:javascript
复制
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
复制
@this.ScriptBlock(
@<script  type='text/javascript'>
    $(document).ready(function () {
        notify('@message', '@Model.Type.ToString()',                    
               '@Model.Type.ToString().ToLower()');
    });
</script>)

然后在主布局中渲染:

代码语言:javascript
复制
@this.WriteScriptBlocks()

点击这里查看全文:A Script-Block Templated Delegate for Inline-Scripts in Razor Partials

票数 22
EN

Stack Overflow用户

发布于 2017-01-12 21:00:23

这对我很有效,允许我将部分视图的javascript和html放在同一个文件中,以便于阅读。

在使用称为"_MyPartialView.cshtml“的局部视图的视图中

代码语言:javascript
复制
<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" } })

 }

在局部视图文件中

代码语言:javascript
复制
@model SomeType

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

@if (region == "HTMLSection")
{


}

@if (region == "ScriptSection")
{
        <script type="text/javascript">
    </script">
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5981490

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档