Рендеринг блоков в Episerver MVC

У меня есть вопрос, который я немного боролся с последними днями. Я пытаюсь понять, как работает рендеринг блоков в Episerver 7 при работе с MVC.

Моя текущая установка, которая действительно работает, выглядит следующим образом:

Я создал тип блока под названием «TeaserBlock», который имеет несколько свойств:

[ContentType(DisplayName = "TeaserBlock", GUID = "571582c4-6b99-4c0a-b000-f62265e312a9", Description = "A Teaser Block for show!")]
public class TeaserBlock : BlockData
{
    [Display( GroupName = SystemTabNames.Content, Order = 1)]
    public virtual string TeaserHeading { get; set; }

    [Display(GroupName = SystemTabNames.Content, Order = 2)]
    public virtual string TeaserText { get; set; }    
}

Для этого у меня есть соответствующее частичное представление в Views/Shared/ под названием TeaserBlock.cshtml. Я думаю, этот блок отображает блок в режиме просмотра?

Моя самая большая проблема заключалась в том, чтобы заставить работать «редактирование на странице», и после некоторых попыток и поиска в Google я наконец заставил его работать со следующим кодом:

[TemplateDescriptor(Inherited = true,
    Tags = new string[] { RenderingTags.Preview },
    TemplateTypeCategory = TemplateTypeCategories.MvcController)]
public class PreviewBlockController : ActionControllerBase, IRenderTemplate<BlockData>
{
    public ActionResult Index(BlockData currentBlock)
    {
        return View(currentBlock);
    }
}

После того, как я добавил соответствующее представление в PreviewBlockController, он работал в режиме «редактирование на странице», что было хорошо. Мне потребовалось довольно много времени, прежде чем я понял, что если строки «TemplateTypeCategory = TemplateTypeCategories.MvcController)» там нет, это не сработает. Кто-нибудь знает, зачем нужна эта строка?

Также есть ли какая-то магия при использовании тега «RenderingTags.Preview»?

Допустим, у меня есть 5 разных блоков в моем приложении. Нужны ли мне 5 разных контроллеров предварительного просмотра и соответствующие им представления?

Я хотел бы иметь более общий «контроллер предварительного просмотра блоков», который мог бы обрабатывать все «редактирование на странице» для моих блоков. Однако я не уверен, возможно ли это, потому что все блоки будут иметь разные свойства и, следовательно, нуждаются в отдельных .cshtml для их предварительного просмотра, если предварительный просмотр будет иметь какое-либо значение, я думаю. Или у меня есть какой-то способ в коде узнать, какие свойства, которые имеют отношение к блоку, отправили его моему контроллеру, чтобы я мог, например, перебрать их? И с помощью этого нужен только один контроллер предварительного просмотра и соответствующий вид?

Есть ли какие-либо рекомендации о том, как справиться с этим наилучшим образом?

Надеюсь, кто-нибудь поможет мне немного лучше понять эту концепцию, мне трудно найти информацию о некоторых концепциях, касающихся эписервера.


person Kneta_    schedule 18.02.2013    source источник
comment
@Kenta_ Я бы посоветовал взглянуть на Джоэл Образец Alloy MVC Абрахамссона, который может быть загружено отсюда. Похоже, он делает некоторые из тех же концепций, которые вы упоминаете, с контроллером предварительного просмотра. Я хотел бы больше помочь, но я также пытаюсь обдумать это.   -  person cjsharp1    schedule 21.02.2013
comment
@cjsharp1 Спасибо за вклад. Да, я искал образцы Джоэла, но некоторые концепции все еще немного сложны для меня, чтобы понять тебя. Мне трудно найти информацию по некоторым понятиям.   -  person Kneta_    schedule 22.02.2013
comment
@Kenta_ Можете ли вы опубликовать код для представления TeaserBlock?   -  person cjsharp1    schedule 23.02.2013
comment
@cjsharp1 Конечно, это выглядит так: (не обращайте внимания на \ в \@, я должен был добавить его здесь) \@использование EPiServer.Core \@использование EPiServer.Web.Mvc.Html \@model AlloyTestMVC.Models.Blocks.TeaserBlock ‹ div class=border› ‹div class=media› ‹div class=mediaImg› ‹img src=\@Model.TeaserImage \@Html.EditAttributes(x =› x.TeaserImage)/› ‹/div› ‹div class=mediaText › ‹h2 \@Html.EditAttributes(x =› x.TeaserHeading)›\@Model.TeaserHeading‹/h2› ‹p \@Html.EditAttributes(x =› x.TeaserText)›\@Model.TeaserText‹/p › ‹/дел› ‹/дел› ‹/дел›   -  person Kneta_    schedule 25.02.2013


Ответы (1)


TemplateTypeCategories соответствует различным поддерживаемым типам «типов шаблонов рендеринга».

public enum TemplateTypeCategories
{
    None = 0,
    WebFormsPage = 1,
    UserControl = 2,
    ServerControl = 4,
    WebFormsPartial = 6,
    WebForms = 7,
    MvcController = 8,
    Page = 9,
    MvcView = 16,
    MvcPartialController = 32,
    MvcPartialView = 64,
    MvcPartial = 96,
    Mvc = 120,
}

Установка TemplateTypeCategories.MvcController заставит EPiServer загрузить блок так, как если бы это была обычная страница. Помните, что экземпляры блоков не работают точно так же, как экземпляры страниц, поэтому мы должны выполнить этот маленький трюк. В противном случае экземпляры блоков будут зарегистрированы как MvcPartialController, и мы не сможем загрузить их напрямую в MVC.

Я создаю свой PreviewBlockController немного проще, чем в AlloyMVC.

using EPiServer.Core;
using EPiServer.Framework.DataAnnotations;
using EPiServer.Framework.Web;
using EPiServer.Web;
using System.Web.Mvc;
using Site.Externwebb.Content.Blocks;

namespace Site.Externwebb.Controllers.Blocks
{
    [TemplateDescriptor(Inherited = true, 
        Tags = new[] { RenderingTags.Preview }, 
        TemplateTypeCategory = TemplateTypeCategories.MvcController)]
    public class PreviewBlockController : Controller, IRenderTemplate<BlockData>
    {
        public ActionResult Index(BlockData currentBlock)
        {
            var baseType = currentBlock.GetType().BaseType;
            if (baseType == typeof(BarkerBlock))
            {
                return View("Barkers", currentBlock);
            }

            if (baseType == typeof(SlideshowInlineBlock))
            {
                return View("Inline", currentBlock);
            }

            // Standard return (general block controller)
            return View("RightColumn", currentBlock);
        }
    }
}

Представления по умолчанию размещаются в ~/Views/PreviewBlock/xxx.cshtml Вот пример

@using EPiServer.Web.Mvc.Html
@model EPiServer.Core.BlockData

@{
    Layout = "~/Views/Shared/Masters/_BlockPreviewMaster.cshtml";
}

@section MainContent{
    <div id="rightContent" style="width:300px;">
        <div id="rightcolumn">
            @{ Html.RenderContentData(Model, false); }
        </div>
    </div>
}

Достаточно хорош и прост в управлении.

Удачи.

/ Эрик Херлиц

person Eric Herlitz    schedule 09.04.2013