C# 变量值仅在 Javascript 中调用时更新一次
C# variable value only update once when called in Javascript
我看了看,只找到了一个类似的 post,但没有真正回答我的问题,或者他们回答了,但我不明白。 post 我读的是这个:Why does this javascript variable I'm creating via C# only get updated once?
我使用的是分页网格视图,每次它的对象数据源运行 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
returns 60,然后这个值更新为7。在服务器端num
等于7,但在客户端它仍然是60 . 有没有办法更新客户端值?
很抱歉我的打字能力很差,英语不是我的母语。
一些示例可能会有所帮助,在此先感谢。
我注意到我在哪里更新这个变量并不重要(在 selectCount 方法或任何其他方法上),在客户端不会更新。
查看您的客户端代码,“<%=num%>”实际上是 运行 在服务器上。如果您在浏览器中检查源代码,您将看到:
function SomeFuntion()
{
alert("60");
}
如您所见--没有要更新的变量。为了看到“60”变为“7”,您必须刷新客户端以获取服务器为 "num".
设置的新值
如果没有您的服务器端代码,我们将无法找到理想的解决方案。但是,您可能会执行以下操作:
- 使用隐藏字段来存储值。
- 为页面使用全局变量,将值传递给 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
时,您的页面会重新初始化,如果您不知情,它可能会修改您的值。这非常重要。
您可以像这样修改您的 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上也有几个例子。
我找到了一个可能的解决方案,效率低下,但它必须这样做。我有一个搜索文本框,每次单击搜索按钮时,都会使用从数据库中检索到的数据更新网格视图。当调用 Onclick
时,它将数据源与 gridView 绑定。我所做的是在绑定下方再次调用 SelectCountMethod,并使用我存储在对象数据源中的相同参数作为 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;
}
}
我看了看,只找到了一个类似的 post,但没有真正回答我的问题,或者他们回答了,但我不明白。 post 我读的是这个:Why does this javascript variable I'm creating via C# only get updated once?
我使用的是分页网格视图,每次它的对象数据源运行 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
returns 60,然后这个值更新为7。在服务器端num
等于7,但在客户端它仍然是60 . 有没有办法更新客户端值?
很抱歉我的打字能力很差,英语不是我的母语。 一些示例可能会有所帮助,在此先感谢。
我注意到我在哪里更新这个变量并不重要(在 selectCount 方法或任何其他方法上),在客户端不会更新。
查看您的客户端代码,“<%=num%>”实际上是 运行 在服务器上。如果您在浏览器中检查源代码,您将看到:
function SomeFuntion()
{
alert("60");
}
如您所见--没有要更新的变量。为了看到“60”变为“7”,您必须刷新客户端以获取服务器为 "num".
设置的新值如果没有您的服务器端代码,我们将无法找到理想的解决方案。但是,您可能会执行以下操作:
- 使用隐藏字段来存储值。
- 为页面使用全局变量,将值传递给 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
时,您的页面会重新初始化,如果您不知情,它可能会修改您的值。这非常重要。
您可以像这样修改您的 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上也有几个例子。
我找到了一个可能的解决方案,效率低下,但它必须这样做。我有一个搜索文本框,每次单击搜索按钮时,都会使用从数据库中检索到的数据更新网格视图。当调用 Onclick
时,它将数据源与 gridView 绑定。我所做的是在绑定下方再次调用 SelectCountMethod,并使用我存储在对象数据源中的相同参数作为 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;
}
}