7

我有一个问题,最近几天我一直在挣扎。我试图了解在使用 MVC 时块的渲染在 Episerver 7 中是如何工作的。

我当前实际工作的设置如下:

我创建了一个名为“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。我猜这个是在视图模式下渲染块?

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

[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 进行预览。或者有什么方法可以让我在代码中找出块中相关的哪些属性将其发送到我的控制器,以便我可以循环遍历它们?并且借助这个只需要一个预览控制器和一个相应的视图?

有没有关于如何以最佳方式处理这个问题的指导方针?

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

4

1 回答 1

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>
}

足够好并且易于管理。

祝你好运。

/埃里克·赫利茨

于 2013-04-09T16:36:48.787 回答