Подтвердить что ты не робот

Как визуализировать JavaScript в разделе MasterLayout с частичного просмотра?

Учитывая двигатель MVC3 и Razor, я получил

_MasterLayout.cshtml

@RenderSection("JavaScript", required: false)
..
..
@RenderBody()
..

View.cshtml с _MasterLayout.cshtml, определенным в _ViewStart.cshtml

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

PartialView.cshtml

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

Как я могу убедиться, что Java Script из Partial View попадает в раздел "Макет макета"? Спасибо.

РЕДАКТИРОВАТЬ: описанный выше сценарий не работает, потому что частичный вид не имеет определяемого макета. С другой стороны, у View есть макет с RenderSection. Если я переведу часть JavaScript из Partial View в View, Razor знает, где его отобразить. Но, поскольку частичный вид не имеет макета, он не знает, что делать с разделом JavaScript и, следовательно, не делает его нигде.

4b9b3361

Ответ 1

Я не верю, что Partial View может устанавливать разделы, которые будут использоваться на странице макета: (

Похоже, нет никаких хороших решений для этого - вы могли бы включить два частичных (один для script, один для контента):

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

Ответ 2

Я создал набор методов расширения для рендеринга блоков сценариев (или чего-либо) из частичного в основной макет.

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 для встроенных скриптов в частицах бритвы

Ответ 3

Это помогло мне разрешить совместное размещение javascript и html для частичного просмотра в том же файле для удобства чтения

В представлении, в котором используется Partial 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">
}