Umbraco True/False 自定义 属性 值解析问题
Umbraco True/False custom property value parsing issue
d 对 Umbraco 如何做到这一点感到非常困惑,如果可能的话,我正在寻找某种解释。我正在使用 Umbraco 7。我在 doc type
上有一个 custom property
,它是一个 True/False
(基本上是一个复选框)。
我在尝试解析 GetPropertyValue
、object 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 并避免这些问题。
d 对 Umbraco 如何做到这一点感到非常困惑,如果可能的话,我正在寻找某种解释。我正在使用 Umbraco 7。我在 doc type
上有一个 custom property
,它是一个 True/False
(基本上是一个复选框)。
我在尝试解析 GetPropertyValue
、object 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 并避免这些问题。