custom property
上有doc type
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将真/假保存为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
答案 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")
时,它是一个没有输入的对象,这可能会导致比较问题。输入支柱并避免这些问题只是最佳做法。