Значение переменной C# обновляется только один раз при вызове в JavaScript
Я посмотрел найденный только похожий пост и на самом деле не ответил на мой вопрос или, возможно, они ответили, но я не понял. Я прочитал пост: Почему эта переменная javascript, которую я создаю через C#, обновляется только один раз?
Я использую постраничную сетку, и каждый раз, когда источник данных объекта запускает 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 или любого другого метода), на стороне клиента не обновляется.
5 ответов
Я нашел возможное решение, неэффективное, но это придется делать. У меня есть текстовое поле поиска, которое каждый раз, когда нажимается кнопка поиска, обновляет вид сетки с использованием полученных данных из базы данных. Когда 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;
}
}
Если взглянуть на ваш клиентский код, то на самом деле "<% = num%>" запускается на сервере. Если вы проверили источник в своем браузере, то увидите:
function SomeFuntion()
{
alert("60");
}
Как видите - нет переменной для обновления. Чтобы увидеть, что "60" изменится на "7", вам нужно обновить клиент, чтобы выбрать новое значение, которое сервер имеет для "num".
Вы можете изменить свой метод 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
Используйте HttpHandler и jQuery. Google - твой друг, на SO тоже есть несколько примеров.
Без вашего серверного кода мы не сможем найти идеальное решение. Тем не менее, вы можете сделать следующее:
- Используйте скрытое поле для хранения значения.
- Используйте глобальную переменную для страницы, чтобы передать значение глобальной переменной в вашем 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
Ваша страница повторно инициализирована, что может изменить значения на вас, если вы не знаете. Это невероятно важно.