2016-06-28 108 views
0

目前,我在CMS中有几种自定义页面类型。为了在处理文档时具有类型安全性,我使用内置的代码生成器为每个页面类型创建类。例如,我已经叫白皮书和Kentico代码生成的网页类型生成两个类:如何为当前文档使用自定义页面类型

public partial class Whitepaper : TreeNode { } 

public partial class WhitepaperProvider { } 

这些类工作的伟大,如果我直接在特定文档使用提供如查询:

WhitepaperProvider.GetWhitepapers().TopN(10); 

但是,我希望能够为当前文档使用Whitepaper类,而不必使用WhitepaperProvider重新查询文档。在这种情况下,我有一个自定义页面模板白皮书,并在后面的代码我希望能够使用自定义类是:

// This is what I'm using 
TreeNode currentDocument = DocumentContext.CurrentDocument; 
var summary = currentDocument.GetStringValue("Summary", string.Empty); 

// This is what I'd like to use, because I know the template is for whitepapers 
Whitepaper currentWhitepaperDocument = // what goes here? 
summary = currentWhitepaperDocument.Summary; 

如何使用我的自定义页面类型的类当前文档?


UPDATE

的答案使用as作品只要一类被注册为当前页面类型提到。我没有想到这个工作,因为我认为DocumentContext.CurrentDocument总是返回一个TreeNode(因此你会有一个逆变问题);如果有一个为页面类型注册的类,它将返回一个类的实例,从而允许您使用as

+0

你试过投当前文档作为您的自定义类?:白皮书currentWhitepaperDocument = DocumentContext。 CurrentDocument作为白皮书 –

回答

1

应尽可能简单as ...

var stronglyTyped = DocumentContext.CurrentDocument as Whitepaper 

...只要您使用注册白皮书类作为文档类型属性上CMSModuleLoader例如:

[DocumentType("WhitepaperClassName", typeof(Namespace.To.Whitepaper))] 

这是关于连接最多强类型的页面类型的对象一个很好的博客文章:http://johnnycode.com/2013/07/15/using-strongly-typed-custom-document-type-classes/

+0

这绝对有效,但我没有想到它。我认为DocumentContext.CurrentDocument总是返回一个TreeNode,但是如果有一个为页面类型注册的类将会自动返回该类。我会更新我的帖子,谢谢! – KingOfTheWood

0

你可以扩展你的部分类(不修改生成的文件,创建一个部分为原件),例如:

public partial class Whitepaper 
{ 
    public Whitepaper CreateFromNode(TreeNode node) 
    { 
     //You should choose all necessary params in CopyNodeDataSettings contructor 
     node.CopyDataTo(this, new CopyNodeDataSettings()); 
     //You should populate custom properties in method above. 
     //this.Status = ValidationHelper.GetString(node["Status"], ""); 
     return this; 
    } 
} 

如何使用它:

new Whitepaper().CreateFromNode(DocumentContext.CurrentDocument) 
相关问题