2013-08-23 3 views
0

Привет У меня есть свойство в моей модели под названием BMI, в основном это некоторая логика, которая возвращает число, вычисленное из метода CalculateBMI, но это всегда возвращает 0, даже когда я помещаю точку останова на возвращаемый метод, вес и рост содержат числа, но _bmi никогда не будет назначено что-нибудьmvc 4 модель, метод всегда возвращается 0?

BMI Свойства:

private int _bmi; 
     [DisplayName("BMI")] 
     public int BMI 
     { 
      get {return _bmi;} 
      set 
      { 
       _bmi = value; 
       _bmi = CalculateBMI(); 

      } 
     } 

CalculateBMI метод:

public int CalculateBMI() 
     { 

      _bmi = Weight/(Height * Height); 
      return _bmi; 
     } 
+2

Здесь есть целая куча странного кода. Почему вы устанавливаете '_bmi = value', а затем устанавливаете его в AGAIN в' CalculateBMI() ', а затем устанавливаете его в AGAIN в рамках фактического метода? Я думаю, вам просто нужно это: '_bmi = CalculateBMI()', а затем в вашем методе 'return Weight/(Height * Height)' – tnw

+0

В вашем сеттере, почему вы устанавливаете '_bmi' на предоставленное значение, а затем сразу же устанавливаете его что-то другое? – asymptoticFault

+0

Он также не похож на то, что вы на самом деле даже делаете что-либо с «значением», которое ваш ИМТ получает. Вы просто выбросите его. Зачем вам нужно вычислять ИМТ в сеттере вашего имущества BMI? Это не имеет никакого смысла. Вы принимаете значение «значение», которое должно начинаться с значения ИМТ, а затем вычислять ИМТ с ИМТ, который вы только что дали? КАКИЕ!? – tnw

ответ

2

Поэтому я считаю, что мы все говорили в комментариях аль л вам нужно это:

public double BMI { get { return Weight/(Height * Height); } } 

@ataravati также правильно о атрибут DisplayName быть ненужным, так как это то же самое, как имя свойства.

Вы также должны изменить тип на double, так как результат должен быть значением с плавающей запятой. Я также хотел бы убедиться, что ваши свойства Weight и Height: double s, чтобы вы не получили нули из целочисленного деления.

0

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

public int BMI 
{ 
    get 
    { 
     return CalculateBMI(); 
    } 
} 

Кстати, вам не нужен атрибут DisplayName, когда отображаемое имя такое же, как имя свойства.

+0

извиняется за ужасный код, но когда я изменил его на вышеуказанный код, он все еще возвращает 0? – CodeSurfer

1

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

нулевому в результате разделения может быть от:

  • Weight = 0
  • Результат деления округляется до 0, так как ваш BMI переменная типа int

Зв .. попробуйте отладки и выполните математику, используя фактические значения. Если результат будет меньше 0,5, он будет округлен до 0, скорее всего.

Вы можете изменить тип ИМТ на Decimal или Double, чтобы попробовать.

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