2016-12-23 7 views
1

Я работаю над this website в Umbraco 7. Моя проблема заключается в фильтрации «gender» на левой стороне, которая является bool (queryString). Этот bool устанавливается для каждого продукта как «Является ли этот продукт для мужчины?» - «Истина или ложь»).Bool property show True & False items

  • Все пол = ничего
  • Мужчина = & пол = истинный
  • Женщина = & пол = ложный

По умолчанию он установлен в положение "Все пол", но в коде, это фактически установлен на true, как вы можете видеть в моем коде. Я хотел бы одновременно показывать как true, так и false.

bool isMale = true должно быть чем-то вроде isMale = true && false, если бы это имело смысл.

<div id="categoryCollection"> 

@{ 
    bool isMale = true; 
} 

@if (!string.IsNullOrEmpty(selectedpriceRange) && selectedpriceRange.Contains("-")) 
{ 
    string[] priceArray = selectedpriceRange.Split('-'); 
    int minPrice = 0; 
    int maxPrice = 0; 

    if (queryString.Get("gender") != null) 
    { 
     isMale = bool.Parse(queryString.Get("gender")); 
    } 

    if (priceArray.Count() == 2 && int.TryParse(priceArray[0], out minPrice) && int.TryParse(priceArray[1], out maxPrice)) 
    { 
     selectedItems.AddRange(productTypes 
      .Where(x => x.HasValue("price") && 
      x.GetPropertyValue<int>("price") > minPrice && 
      x.GetPropertyValue<int>("price") < maxPrice && 
      x.HasValue("gender") && 
      x.GetPropertyValue<bool>("gender") == isMale) 
      .Skip((page - 1) * pageSize).Take(pageSize)); 

     foreach (var item in selectedItems.Skip((page - 1) * pageSize).Take(pageSize)) 
     { 
      /* If pricerange is selected */ 
      @buildItemProduct(item); 
     } 
    } 
} 
else 
{ 
    if (queryString.Get("gender") != null) 
    { 
     isMale = bool.Parse(queryString.Get("gender")); 
    } 
    selectedItems.AddRange(productTypes.Where(x => x.HasValue("gender") && x.GetPropertyValue<bool>("gender") == isMale)); 

    foreach (var item in selectedItems.Skip((page - 1) * pageSize).Take(pageSize)) 
    { 
     /* If pricerange is selected */ 
     @buildItemProduct(item); 
    } 
} 
</div> 

Если вы хотите, чтобы увидеть весь мой код, который вы можете увидеть его here.

Я не знаю, как объявить «isMale», чтобы одновременно показывать как истинные, так и ложные продукты.

+0

Это звучит как задание для перечисления или, по крайней мере, с нулевым значением bool. – adv12

+0

Дело в том, что пока мне не очень удобно в этом коде. Если у вас есть пример того, как это будет работать, я буду очень счастлив! –

+0

у вас есть 3 корпуса - мужчина и женщина - мужчина - женщина. поэтому, вы должны проверить каждый случай отдельно. ложных или истинных утверждений недостаточно для установки фильтра. если бы это было так, вы могли бы фильтровать только мужчина или женщина. думать о. это – Badiparmagi

ответ

2

Вы можете использовать другое логическое значение, чтобы сохранить изменения минимальны:

//... 
var bothGender = true; 
if (queryString.Get("gender") != null) 
{ 
    isMale = bool.Parse(queryString.Get("gender")); 
    bothGender = false; 
} 

if (priceArray.Count() == 2 && int.TryParse(priceArray[0], out minPrice) && int.TryParse(priceArray[1], out maxPrice)) 
{ 
    selectedItems.AddRange(productTypes 
     .Where(x => x.HasValue("price") && 
     x.GetPropertyValue<int>("price") > minPrice && 
     x.GetPropertyValue<int>("price") < maxPrice && 
     x.HasValue("gender") && 
     (bothGender || x.GetPropertyValue<bool>("gender") == isMale)) // <-- changes here 
     .Skip((page - 1) * pageSize).Take(pageSize)); 

//... 

Или использовать перечисление.

+1

Для немного более чистого кода вы можете инициализировать 'bothGender'' true', установить его в 'false' внутри блока' if' и пропустить 'else'. – adv12

+0

@ adv12 ты совершенно прав! –

+0

Это работало как шарм! Я случайно проверяю, не выбрал ли параметр цены. Это работает как прелесть, спасибо, Томас, сегодня я узнал что-то новое. Я зачислил вас сюда: https://our.umbraco.org/forum/templates-partial-views-and-macros/82026-bool-property-show-true-false-items –