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 特定的。
在其他 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 特定的。