Миграция из Искры в Бритву - PullRequest
3 голосов
/ 05 июля 2011

Мы постепенно переносим проект на основе Spark для использования Razor, и я столкнулся с чем-то, на что, похоже, не могу найти ответ.

Моя строка в моем Spark-мастере вызывает подпрограмму. Выглядит так:

<Sidebar>   
    <segment name="header"> 
        <div> <!-- header content--> </div>
    </segment>
    <segment name="content"> 
        <div> <!-- content content--> </div>
    </segment>
</Sidebar>

Боковая искра выглядит так

<div id="sidebar" >
<div class="header">
    <render segment="header">
        <!-- placeholder -->
    </render>
</div>
<div class="ui-layout-content content">
    <render segment="content">
        <!-- placeholder -->
    </render>   
</div>

Это делаетс содержанием из первого раздела отображается в макете из второго.Есть ли способ, как я могу воссоздать это с помощью Razor.Я вижу, что мне нужно использовать Partials, но я не вижу, как передать содержимое в подпредставление боковой панели.

По сути, я пытаюсь воссоздать функциональность, которую Spark вызывает Сегменты (или ранее разделы) http://sparkviewengine.com/reference/elements#segmentpreviouslyknownassection

РЕДАКТИРОВАТЬ: дополнительная информация.У меня есть Index.cshtml, который получает его макет из Application.cshtml.Здесь у меня есть код разметки, который входит в частичную часть Sidebar.cshtml.

Если я добавлю put @section header (который отображается в Sidebar.cshtml) в моем файле Index.cshtml, он не распознает его как допустимый раздел.У меня есть @RenderSection("header", false) в моем файле Sidebar.cshtml.

Как связать эти 2 вместе?

Итак, моя иерархия выглядит следующим образом

Application.cshtml - глобальный макет страницыIndex.cshtml - макет страницы, включая содержимое для боковой панелиSidebar.cshtml - Шаблон / раскладка содержимого боковой панели из Index.cshtml.

Например,

в Index.cshtml

    @RenderPage("Sidebar") 
    @section SidebarHeader { <!--Title or something --> }
    @section SidebarContent { <!--Content --> }

Затем в Sidebar.cshtml

    <div class="header">
        @RenderSection("SidebarHeader", false)
    </div>
    <div class="ui-layout-content content">
        @RenderSection("SidebarContent", false)
    </div>

Идея в том, что я могу иметь шаблонво вложенном представлении, которое заполняется содержимым представления.Это означает, что я могу шаблонировать области для других страниц сайта.Например.Содержимое боковой панели на другой странице будет иметь тот же формат, но другой контент.

Ответы [ 2 ]

6 голосов
/ 05 июля 2011

Вы можете использовать макеты и разделы для достижения того же. Подробности здесь: http://weblogs.asp.net/scottgu/archive/2010/12/30/asp-net-mvc-3-layouts-and-sections-with-razor.aspx

Index.cshtml:

@RenderSection("Sidebar")

Ваш sidebar.cshtml будет выглядеть так:

<div id="sidebar" >
    <div class="header">
        @RenderSection("header", required: false)
    </div>
    <div class="ui-layout-content content">
        @RenderSection("content", required: false)  
    </div>
</div>

И подобного рода представления (вы также можете определить их в одном, но их разделение, вероятно, лучше в долгосрочной перспективе):

SubViews.cshtml:

    @section header {
      <div> <!-- header content--> </div>

    }

    @section content {
      <div> <!-- content content--> </div>

    }
0 голосов
/ 06 июля 2011

Единственный способ заставить эту работу работать так, как я хочу, заключается в следующем.

Создать класс для представления контента из моего подпредставления

например

public class Sidebar
{
    public string Title { get; set; }
    public IHtmlString Contents { get; set; }
}

Затем в _viewstart.cshtml

Func<Sidebar, HelperResult> sidebarHelper =
    @<div class="sidebar">
        <div>@item.Title</div>
        <div>
            @item.Contents
        </div>
    </div>;
ViewContext.Controller.ViewData["SidebarTemplate"] = sidebarHelper ;

Затем вверхумоего Index.cshtml

var sidebarTemplate = ViewContext.Controller.ViewData["SidebarTemplate"] as Func<Sidebar, HelperResult>; 

Который я могу назвать далее так:

@{ 
    var sidebarContents= new StringBuilder(); 
    foreach(var x in y)
    {
        sidebarContents.append("<div>Some Potentially Long nasty HTML STRING" + x.Something + "</div>");
    }
}
@sidebarTemplate (new Sidebar()
{ 
    Title = "title",
    Contents = Html.Raw(sidebarContents.ToString())
})

Мне не очень нравится, что я должен объявить HTML в коде, как этопотенциально это может быть длинная строка.Технически считается, что это решает проблему.Если у кого-то есть идеи получше или если я не проясняю себя достаточно, пожалуйста, прокомментируйте!Спасибо.

...