【问题标题】:Umbraco True/False custom property value parsing issueUmbraco True/False 自定义属性值解析问题
【发布时间】:2016-07-09 08:30:25
【问题描述】:

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") 会返回什么?
  • 1 或 0,取决于复选框是否被选中。这是一个对象(int)
  • 如果您在该行收到 object not reference to an object 错误,那么它不是 1 或 0 - 它是 null
  • 当您尝试投射到 int 时遇到什么错误?
  • 查看上面的图片。我也可以ToString() 其他属性。

标签: c# linq umbraco


【解决方案1】:

似乎x.GetPropertyValue("closedQuestions") 在某些情况下返回null(或者可能是带有空值的int?),这就是您在尝试调用ToString() 时遇到该错误的原因。如果x.GetPropertyValue&lt;int&gt;("closedQuestions") 适合你,那就太好了,但我想指出一件事:

您不应通过将值类型转换为对象并使用== 来比较值类型(如int)。强制转换为对象将封装值类型并使用引用相等,这将失败:

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

你可以改用object.Equals():

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

【讨论】:

    【解决方案2】:

    你也可以解析它是x.GetPropertyValue&lt;bool&gt;("propName"),这样比较容易一些,而且我从来没有遇到过这种方法给我带来问题。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-06-16
      • 1970-01-01
      • 2017-08-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-06
      相关资源
      最近更新 更多