2015-04-15 1 views
2

Я смотрю найденный только похожий пост и на самом деле не ответил на мой вопрос или, возможно, сделал, но я не понял. Сообщение, которое я прочитал, было следующим: Why does this javascript variable I'm creating via C# only get updated once?Значение переменной C# обновляется только один раз при вызове в Javascript

Я использую сетчатый сетчатый сет и каждый раз, когда источник данных объекта запускает SelectCountMethod, я использую возвращаемое значение в javascript. Но, я заметил, что даже думал, что те же возвращенные изменения стоимости, на стороне сервера. В javascript это значение не обновляется.

Моя программа довольно длинная, но я буду использовать базовый пример и, надеюсь, некоторые из вас поймут это.

сторона

Клиента:

function SomeFuntion() 
{ 
    alert("<%=num%>"); 
} 

сторона сервера:

//Global variable 
Public Static int num = 0; 

Public int SelectCountMethod() 
{     
    var num = SomeMethod(); //Returns int 

    return num; 
} 

Например, на стороне сервера num возвращает 60, а затем эти обновления значения до 7. На стороне сервера num равен 7, но на стороне клиента все равно 60. Есть ли способ обновить значение сторон клиента?

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

Я заметил, что не обновляется эта переменная (по методу selectCount или любому другому методу), на стороне клиента не обновляется.

+4

Где находится код вашей серверной системы? Обычно вы не можете просто «нажимать» изменения с сервера на клиента по требованию, вам нужно будет использовать что-то вроде [SignalR] (http://signalr.net/). – mason

+0

Думаю, нам нужен более реалистичный пример. Если это использует PostBack, он должен работать нормально. Если вы делаете что-то с AJAX, оно не будет обновляться, поскольку это выражение оценивается на стороне сервера. – dman2306

+0

@mason Оба файла моего клиента и сервера хранятся в одном и том же локальном каталоге. Почему я не могу просто делать эти изменения по требованию? –

ответ

0

Я нашел возможное решение, неэффективное, но это нужно будет сделать. У меня есть текстовое поле поиска, которое при каждом нажатии кнопки поиска обновляет вид сетки с извлеченными данными из базы данных. Когда вызывается Onclick, он связывает источник данных с gridView. То, что я сделал, снова вызвало SelectCountMethod прямо под привязкой и использовал те же параметры, что и я, хранящиеся в источнике данных Object как параметры для selectCountMethod. Затем сумма, возвращаемая selectCount, я сохранил ее на hiddenField и все.

//Global variables 
string _param1 = string.Empty, 
     _param2 = string.Empty; 

//On click method for search btn 
protected void OnSearch(object sender, EventArgs e) 
{ 
    gv.DataBind(); 

    someHiddenField = SelectCountMethod(param1, param2); 
} 

protected void OnSelecting(object sender, ObjectDataSourceSelectingEventArgs e) 
    { 
     try 
     { 
      e.InputParameters["Param1"] = param1; 

      _param1 = param1     

      e.InputParameters["Param2"] = param2; 

      _param2 = param2;  
     } 
     catch (Exception ex) 
     { 
      cvServerError.IsValid = false; 
      cvServerError.ErrorMessage = ex.Message; 
     } 
    } 
1

Обращаясь к вашему коду на стороне клиента, на сервере фактически выполняется «<% = num%>». Если вы изучили источник в вашем браузере, что вы видите:

function SomeFuntion() 
{ 
    alert("60"); 
} 

Как вы можете видеть - нет переменной для обновления. Чтобы увидеть, что «60» изменится на «7», вам нужно обновить клиент, чтобы получить новое значение, которое сервер имеет для «num».

+0

Я думал об этом, но функция клиентской стороны запускается после того, как 'num' был обновлен, как вы думаете, по-прежнему необходимо обновить клиент? –

+0

Затем вы можете подтвердить это, просмотрев источник в своем браузере.Если вы видите, «alert (« 60 »)», то вы ошибаетесь - он запускается до того, как сервер изменит его. Если вы видите «alert (« 7 »), то он запускается после. Код «<%=num%>» является серверным кодом и запускается на сервере. – Russ

0

Без кода на стороне сервера мы не сможем найти идеальное решение. Однако вы можете сделать следующее:

  • Используйте скрытое поле для хранения значения.
  • Используйте глобальную переменную для страницы, чтобы передать значение глобальной переменной в вашем JavaScript.

Самый простой способ - это Hidden Field, причина в том, что вы можете легко изменять данные как на клиенте, так и на сервере без каких-либо реальных проблем. Вы хотите, чтобы вы часто не изменяли состояние.

<input type="hidden" id="hdTimer" runat="server" /> 

Затем вы можете сделать свой JavaScript, такие как:

$('#Example').on('change', function() { 
    $('#hdTimer').val('60'); 
}); 

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

var content = hdTimer.value; 

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

// Server Side 
var example = 60; 
protected void Page_Load(object sender, EventArgs e) 
{ 

} 

Так что Global будет содержать значение, но при повторной инициализации значения в Page Load он будет держать в состоянии нажать обновленное значение для вашего JavaScript:

//Client Side: 
var example = '<%= example %>'; 

Ключ, хотя, будет чтобы обеспечить правильную повторную инициализацию значения.

Когда вы делаете PostBack, ваша страница повторно инициализируется, что может изменить значения на вас, если вы не знаете. Это невероятно важно.

+0

Я знаю, что если моя переменная является глобальной, в ответ на это значение может измениться, и я попытался использовать скрытые поля (забыл упомянуть об этом), но вы не можете получить доступ к скрытым полям или любому другому элементу управления внутри метода, который он вызывается Объектный источник данных. Каждый раз, когда я делал, получил нуль. –

+0

Вы уверены, что по любому методу Server Side, если я назову 'hdTimer.value', я получаю правильное значение. Тогда вам понадобится больше контекста. – Greg

+0

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

0

Вы можете изменить свой метод JS, как этот

var myMsg = <%=num%>; 
function SomeFuntion() 
{ 
    alert(myMsg); 
} 

и в коде

public int num = 60;  
public int SelectCountMethod() 
    {     
     num = SomeMethod(); //Returns int 
     ScriptManager.RegisterStartupScript(this, 
                 this.GetType(), 
                 "Funct", 
                 "myMsg = " + num + ";", 
                 true); 
     return num; 
    } 

Таким образом, каждый раз, когда ваш метод SelectCountMethod() называется, переменная JS myMsg получить новое значение из-за строка ScriptManager.RegisterStartupScript

+0

Я бы посоветовал против 'ScriptManager'. Это принесет больше вреда, чем пользы. Это потенциально может быть разрешено. – Greg

+0

Не могли бы вы рассказать о вреде? Я использовал его в течение многих лет и не причинил вреда. – dman2306

+0

Пробовал это и не работал, но спасибо за ваше предложение. –

0

Используйте HttpHandler и jQuery. Google - ваш друг, есть несколько примеров и для SO.