2015-02-17 1 views
0

dVery запутывается в том, как Umbraco это сделал, и я ищу какое-то объяснение, если это возможно. Я использую Umbraco 7. У меня есть custom property на doc type, который является True/False (в основном, флажок).Ошибка в анализе прав на интеллектуальную собственность Umbraco 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#, который, возможно, я ничего не знал, и ничего не нужно делать w/Umbraco, но я знаю, если я объект и попытаюсь проверить, равно ли это значение другой строке или нет, оно работает.

Цените его.


EDIT:

После прочтения, что Umbraco сохраняет истина/ложь как междунар.

True/False - это простой флажок, который сохраняет 0 или 1, в зависимости от того, установлен ли флажок.

Я также посмотрел, как правильно разобрать из object(int) Better way to cast object int

Однако, это все еще не работает

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

EDIT 2:

Это работа, с получением правильного значения. Какие-нибудь ответы на вопрос почему?

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

Чтобы показать вам, что это не пустой:

enter image description here

После изменения в int.Parse(....).ToString()) == 1

enter image description here

+0

Что делает 'x.GetPropertyValue (" closedQuestions ")' return, когда вы смотрите в отладчике? –

+0

либо 1, либо 0, в зависимости от того, установлен ли флажок. Это объект (int) –

+0

Если вы получаете ошибку 'object not reference to object' в этой строке, то это не 1 или 0 - это' null' –

ответ

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) 
0

Вы также можете разобрать его в x.GetPropertyValue<bool>("propName"), которые могли бы сделать его немного проще для сравнения, и у меня никогда не было этого метода, дайте мне проблему.

Кроме того, важно отметить, что когда вы делаете getPropertyValue("propName"), это объект без ввода текста, что может вызвать проблемы со сравнением. Лучше всего набирать подсказку и избегать этих проблем.

Смежные вопросы