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

Umbraco True/False custom property value parsing issue

d 对 Umbraco 如何做到这一点感到非常困惑,如果可能的话,我正在寻找某种解释。我正在使用 Umbraco 7。我在 doc type 上有一个 custom property,它是一个 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 将 true/false 保存为 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,

向您展示它不为空:

更改为int.Parse(....).ToString()) == 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)

您也可以将其解析为 x.GetPropertyValue<bool>("propName"),这可能会使比较更容易一些,而且我从来没有遇到过这种方法的问题。

此外,请务必注意,当您执行 getPropertyValue("propName") 时,它是一个没有类型的对象,这可能会导致比较问题。最好的做法是输入 prop 并避免这些问题。