在Episerver MVC中渲染块

我有一个问题,在过去的几天里我一直在挣扎。 我试图了解在使用MVC时,Epicsver 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作为预览。 或者有没有什么方法可以让我在代码中找出块中与哪些属性相关的属性,将它们发送给我的控制器,以便我可以循环使用它们? 在这种帮助下只需要一个预览控制器和相应的视图?

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

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


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

链接地址: http://www.djcxy.com/p/11813.html

上一篇: Rendering of blocks in Episerver MVC

下一篇: How to binary serialize a class in a Portable Class Library?