Kne*_*ta_ 7 episerver c#-4.0 episerver-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; }
}
Run Code Online (Sandbox Code Playgroud)
为此,我在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);
}
}
Run Code Online (Sandbox Code Playgroud)
在我向PreviewBlockController添加了相应的视图后,它在"on page edit"中工作,这很好.我花了很长时间才意识到"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,
}
Run Code Online (Sandbox Code Playgroud)
设置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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
视图默认放置在 ~/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>
}
Run Code Online (Sandbox Code Playgroud)
足够好并且易于管理。
祝你好运。
/埃里克·赫利茨