在Episerver MVC中渲染块

时间:2013-02-18 10:39:00

标签: c#-4.0 episerver episerver-7

我有一个问题,我在最后几天一直在努力。我正在尝试理解在使用MVC时块的渲染如何在Episerver 7中工作。

我目前的实际设置如下:

我创建了一个名为“TeaserBlock”的Block Type,它有几个属性:

[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。 这个在视图模式下渲染块我猜?

我最大的问题是让“页面编辑”工作,经过一些尝试和谷歌搜索,我终于使用以下代码:

[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添加了相应的视图后,它在“on page edit”中工作,这很好。我花了很长时间才意识到“TemplateTypeCategory = TemplateTypeCategories.MvcController”这一行是不是在那里它没有用。任何人都知道为什么这条线是必要的?

使用Tag“RenderingTags.Preview”时还有一些魔法吗?

假设我的应用程序中有5个不同的块,那么我还需要5个不同的预览控制器和相应的视图吗?

我想要的是拥有一个更通用的“块预览控制器”,它可以处理我的块的所有“页面编辑”。我不确定这是否可行,因为所有块都有不同的属性,因此如果预览有任何意义,我需要单独的.cshtml进行预览。或者在代码中是否有一些方法可以找出块中相关的属性将它发送给我的控制器,以便我可以循环它们?在此帮助下,只需要一个预览控制器和相应的视图?

是否有关于如何以最佳方式处理此问题的指导原则?

希望任何人都可以帮助我更好地理解这个概念,我发现很难找到关于episerver的一些概念的信息。

1 个答案:

答案 0 :(得分:3)

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加载Block,就好像它是普通页面一样,请记住块实例不像页面实例那样完全正常所以我们必须执行这个小技巧。否则,块实例将注册为 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>
}

足够好,易于管理。

祝你好运。

/ Eric Herlitz