2011-12-24 22 views
1

Я использую Ajax для возврата значений с сервера, но при вызове метода incrementvalue(), _value имеет нулевую ссылку, даже если она установлена ​​ранее в методе intialisevalue(). У меня есть пример кода ниже.C# класс null reference

public class test 
{ 
    public int value; 

    public void increment(int _value) 
    { 
     value = value + _value; 
    } 

    public void setvalue(int _value) 
    { 
     value = _value; 
    } 
} 

public test _value; 

public JsonResult intialisevalue() 
{ 
    _value = new test(); 
    _value.setvalue(9); 

    return Json(_value); 
} 

public JsonResult incrementvalue() 
{ 
    _value.increment(2); 
    return Json(_value); 
} 

Любые идеи?

+0

В целом контроллеры не имеют состояния, поэтому вы не можете хранить данные в контроллере между запросами. –

ответ

0

Ваше значение не сохраняется между вызовами контроллера. Когда вы вызываете метод incrementvalue, он работает с новой копией этого поля. Вероятно, вы обнаружите, что оно выбрасывает исключение, потому что значение _value равно null.

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

0

Вы не назначаете новую ссылку на _value следующим образом.

public JsonResult incrementvalue() 
{ 
    _value.increment(2); 
    return Json(_value); 
} 

Вы должны изменить его следующим образом.

public JsonResult incrementvalue() 
{ 
    _value=new Test(); //Assigns a new reference to `_value` 
    _value.increment(2); 
    return Json(_value); 
} 
+0

Это исправит ошибку, которая может возникнуть, но вы только когда-нибудь получите 2 назад, когда вы вызываете метод incrementvalue, и это не похоже на incrementvalue, это делает его работу. – Hammerstein

0

Вам необходимо повторно инициализировать _value каждый звонок на сервер. HTTP не имеет состояния, ваши переменные не сохраняют свое состояние между запросами.

1

Контроллеры существуют только в рамках запроса. после отправки ответа контроллер находится. таким образом, test больше не существует. вам необходимо передать испытуемый объект в контроллер

public JsonResult incrementvalue(test t, increment i) 
{ 
     t.increment(i); 
     return Json(t); 
}