【问题标题】:Umbraco 7 generic node classUmbraco 7 通用节点类
【发布时间】:2016-05-05 12:37:46
【问题描述】:

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

我想在 app_code .cshtml 文件中构建一些通用类,例如从函数的文档中返回属性值,例如

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;

}

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

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

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

我试图建立一个类,它的属性来保存返回的节点

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 umbraco umbraco7 app-code


    【解决方案1】:

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

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

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

    编辑

    这是整个类文件的示例 - 我的示例命名空间是 Umbraco7,我的示例类名称是 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();
            }
        }
    }
    

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

    @Helpers.docFieldValue(1076, "introduction")
    

    Helpers 是我选择的类名。它可以是你想要的“任何东西”。我刚刚对此进行了测试,它可以工作。

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

    【讨论】:

    • 首先,使用 .cshtml 文件是不必要的,请改用 .cs 文件 - 我还能使用 UmbracoHelper 吗?至于在对象之外使用它,您的意思是作为全局公共变量吗?我已经做到了。如何将返回的文档存储为变量(var 除外),即它是什么类型,以便我可以使其成为类的属性?提前致谢
    • 是的,你可以 - 只要你有一个 UmbracoContext,UmbracoHelper 应该可以在几乎任何地方使用。 UmbracoHelper 返回的任何内容(不是属性)都是 IPublishedContent 类型 - 在 our.umbraco.org/documentation/reference/querying/umbracohelper 中也有说明。
    • 是的,我的意思是作为一个全局变量。不过,它不一定要公开。
    • 抱歉,我试图存储返回的文档,例如 public static iPublishedContent myDoc 并且它崩溃了......我如何将它声明为一个类的属性(即不仅仅是一个'var')跨度>
    • 最后一个问题:如何从 Umbraco 模板访问 cs 文件中的类/使用@followed by file name 失败
    猜你喜欢
    • 2014-10-30
    • 1970-01-01
    • 1970-01-01
    • 2012-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多