Umbraco 7 通用节点 class

Umbraco 7 generic node class

在其他 Whosebug 用户的帮助下,我的解决方案已经取得了一些进展,但已经停止了。

我想在 app_code .cshtml 文件中构建一些通用的 classes,例如,一个是来自函数文档的 return 属性 值,例如

public static string docFieldValue(int docID,string strPropertyName){
    var umbracoHelper = new  Umbraco.Web.UmbracoHelper(Umbraco.Web.UmbracoContext.Current);
    var strValue = "";
    try{
        strValue = umbracoHelper.Content(docID).GetPropertyValue(strPropertyName).ToString();   
    }
    catch(Exception ex){
        strValue = "Error - invalid document field name (" + strPropertyName + ")";
    }


    var nContent = new HtmlString(strValue);

    return nContent;

}

这适用于 returning 文档中的一个字段(即 属性)。但是,如果我想 return 2 或更多,理想情况下,我会将 returned 节点存储在变量或 class 中,然后能够重复获取 属性 值无需在每次调用时查找文档 即不调用

umbracoHelper.Content(docID).GetPropertyValue(strPropertyName).ToString();

每次使用不同的 strPropertyName 参数,因为我认为这将意味着从数据库中多次读取)。

我尝试构建一个 class,其属性可容纳 returned 节点

using Umbraco.Web;

using Umbraco.Core.Models;

...
public static Umbraco.Web.UmbracoHelper umbracoHelper = new Umbraco.Web.UmbracoHelper(Umbraco.Web.UmbracoContext.Current);
public static IPublishedContent docNode;

...
docNode = umbracoHelper.Content(docID);

但这会使代码崩溃。我可以将节点存储在 class 上的 属性 中吗?如果可以,它是什么类型?

首先,不需要使用 .cshtml 文件,而是使用 .cs 文件:-) CSHTML 文件用于 Razor 代码和 HTML 之类的东西,CS 文件用于"pure" C#。这也可以解释为什么你最后的想法会失败。

其次,UmbracoHelper 使用 Umbracos 自己的缓存,这意味着每个请求都不会触及数据库。我至少会在方法之外定义 umbracoHelper 对象(因此每次调用方法时都会重用它而不是重新初始化)。

此外,请注意 属性 值可以包含除字符串之外的各种其他对象类型。

编辑

这是整个 class 文件的示例 - 我的示例命名空间是 Umbraco7,我的示例 class 名称是 Helpers:

using Umbraco.Web;

namespace Umbraco7
{
    public class Helpers
    {
        private static UmbracoHelper umbracoHelper = new UmbracoHelper(UmbracoContext.Current);
        private static dynamic docNode;

        public static string docFieldValue(int docID, string strPropertyName)
        {
            docNode = umbracoHelper.Content(docID);
            return docNode.GetPropertyValue(strPropertyName).ToString();
        }
    }
}

这是一个如何在视图中调用函数的示例(Views 文件夹中的 .cshtml 文件):

@Helpers.docFieldValue(1076, "introduction")

Helpers 是我选择的 class 名称。可以是你想要的"anything"。我刚刚测试了这个并且它有效。

我建议您阅读一般 ASP.NET MVC 和 Razor 开发,因为这不是 Umbraco 特定的。