Umbraco True / False定制属性值解析问题

时间:2015-02-17 18:53:11

标签: c# linq umbraco

对于Umbraco如何做到这一点感到困惑,如果可能的话,我正在寻找某种解释。我正在使用Umbraco 7.我在custom property上有doc type True/False(基本上是一个复选框)。

我在尝试解析GetPropertyValueobject not reference to an object时遇到错误,True/False复选框。

在解析1 INTO对象时,我不会收到错误。

代码:

var topics = topicDocType.Select(x => new ForumModel
             {
                   Topic = x.Name,
                   TopicId = x.Id,
/*no error*/       IsClosedForQuestions = x.GetPropertyValue("closedQuestions") == (object)1 ? true : false,
                   Questions = x.Descendants().Where(y => y.DocumentTypeAlias.Equals("Question")).Select(y => new Question
                   {
                        QuestionName = y.GetPropertyValue("question").ToString(),
                        QuestionId = y.Id,
                        QuestionDateTime = y.CreateDate,
                        AskedBy = y.GetPropertyValue("askedBy").ToString(),
   /*no error*/         IsClosedForPosts = y.GetPropertyValue("closedPosts") == (object)1 ? true : false,
                        Posts = y.Descendants().Where(z => z.DocumentTypeAlias.Equals("Post")).Select(z => new Post
                    .... more code here

这不起作用,我不明白为什么:

var topics = topicDocType.Select(x => new ForumModel
             {
                   Topic = x.Name,
                   TopicId = x.Id,
/*doesn't work*/   IsClosedForQuestions = int.Parse(x.GetPropertyValue("closedQuestions").ToString()) == 1 ? true : false,
                    .... more code here

这也不起作用:

var topics = topicDocType.Select(x => new ForumModel
             {
                   Topic = x.Name,
                   TopicId = x.Id,
/*doesn't work*/   IsClosedForQuestions = x.GetPropertyValue("closedQuestions").ToString() == "1" ? true : false,
                    .... more code here

如果我创建一个测试变量

var test = new ContentService().GetById(2269).GetValue("closedQuestions");

test的值为0,b / c未选中复选框。如果我检查它,再次运行它,值为1

这可能只是一个C#问题,或许我对此一无所知,并且Umbraco没什么可做的,但我知道我是.ToString()一个对象并试图检查该值是否等于另一个字符串是否有效。

欣赏它。


修改

在阅读了Umbraco将真/假保存为int之后。 True/False built-in-prop

True / False是一个简单的复选框,可以保存0或1,具体取决于要检查的复选框。

我还查找了如何从object(int)正确解析 Better way to cast object int

然而,这仍然无效

IsClosedForQuestions = (int)x.GetPropertyValue("closedQuestions") == 1 ? true : false,

编辑2:

这样做有效,可以检索正确的值。关于为什么会有任何答案?

IsClosedForQuestions = x.GetPropertyValue<int>("closedQuestions") == 1 ? true : false,

告诉你它不是空的:

enter image description here

更改为int.Parse(....).ToString()) == 1

enter image description here

2 个答案:

答案 0 :(得分:1)

似乎x.GetPropertyValue("closedQuestions")在某些情况下会返回null(或者可能是int?的空值),这就是为什么您在尝试时遇到错误的原因在上面拨打ToString()。如果x.GetPropertyValue<int>("closedQuestions")对您有用,那么这很棒,但我想指出一件事:

您不应该通过将值类型(例如int)转换为对象并使用==来比较它们。转换为对象将使用值类型并使用将失败的引用相等性:

object o1 = 1;
object o2 = 1;
Console.WriteLine(o1 == o2);  // will print `false`

您可以使用object.Equals()

IsClosedForQuestions = object.Equals(x.GetPropertyValue("closedQuestions"),1)

答案 1 :(得分:0)

你也可以解析它x.GetPropertyValue<bool>("propName"),这可能会让它更容易进行比较,而我从来没有这种方法给我一个问题。

另外,需要注意的是,当您执行getPropertyValue("propName")时,它是一个没有输入的对象,这可能会导致比较问题。输入支柱并避免这些问题只是最佳做法。