C#变量值在Javascript中调用时仅更新一次

C#变量值在Javascript中调用时仅更新一次,javascript,c#,asp.net,webforms,objectdatasource,Javascript,C#,Asp.net,Webforms,Objectdatasource,我只找到了一个类似的帖子,没有真正回答我的问题,或者他们回答了,但我不明白。我读的帖子是这样的: 我使用的是分页的gridview,每次它的对象数据源运行SelectCountMethod时,我都使用javascript上的返回值。但是,我注意到,即使在服务器端,相同的返回值也会发生变化。在javascript上,此值不会更新 我的程序很长,但我将使用一个基本的例子,希望你们中的一些人能够理解它 客户端: function SomeFuntion() { alert("<%=num

我只找到了一个类似的帖子,没有真正回答我的问题,或者他们回答了,但我不明白。我读的帖子是这样的:

我使用的是分页的gridview,每次它的对象数据源运行SelectCountMethod时,我都使用javascript上的返回值。但是,我注意到,即使在服务器端,相同的返回值也会发生变化。在javascript上,此值不会更新

我的程序很长,但我将使用一个基本的例子,希望你们中的一些人能够理解它

客户端:

function SomeFuntion()
{
    alert("<%=num%>");
}
例如,在服务器端
num
返回60,然后该值更新为7。在服务器端
num
等于7,但在客户端仍然是60。是否有更新客户端值的方法

我很抱歉我打字能力差,英语不是我的母语。 一些例子可能会有所帮助,请提前感谢


我注意到在哪里更新这个变量并不重要(在selectCount方法或任何其他方法上),在客户端不更新。

查看您的客户端代码,实际上在服务器上运行“”。如果在浏览器中检查源代码,您将看到:

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

如您所见,没有要更新的变量。为了看到“60”变为“7”,您必须刷新客户端以获取服务器对“num”的新值。如果没有服务器端代码,我们将无法找到理想的解决方案。但是,您可能会执行以下操作:

  • 使用隐藏字段存储值
  • 为页面使用全局变量,将值传递给JavaScript中的全局变量
最简单的是
隐藏字段
,原因是您可以轻松地修改客户端和服务器上的数据,而不会出现任何实际问题。您需要确保不会将状态修改为“经常”

<input type="hidden" id="hdTimer" runat="server" />
现在,在整个客户机代码中,您可以修改字段,而不会出现任何问题,但是当您需要提交表单时,您可以进行
回发。您可以使用现场服务器端:

//Global variable
Public Static int num = 0;

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

    return num;
}
var content = hdTimer.value;
不过,正如我所指出的,过度的交叉操纵可能会在某个时候引发问题。取决于复杂性。你的另一个方法是全球战略

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

}
因此,此全局值将保留该值,但当您在
页面加载处重新初始化该值时,它将保留该值,以便能够将更新后的值推送到JavaScript:

//Client Side:
var example = '<%= example %>';
//客户端:
var示例=“”;
但关键是要确保正确地重新初始化该值


当您执行
回发时
您的页面将重新初始化,如果您不知道,可以修改您的值。这非常重要。

您可以这样修改JS方法

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

因此,每次调用您的方法
SelectCountMethod()
,您的JS变量
myMsg
都会得到一个新值,因为行
ScriptManager.RegisterStartupScript
使用HttpHandler和jQuery。谷歌是你的朋友,这里也有几个例子。

我找到了一个可能的解决方案,效率很低,但必须这样做。我有一个搜索文本框,每次单击搜索按钮时,都会用从数据库检索到的数据更新网格视图。调用
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;
        }
    }

您的服务器端代码在哪里?通常情况下,您不能按需将更改从服务器“推送”到客户端,您需要使用类似的东西。我认为我们需要一个更现实的示例。如果这是使用回发,它应该可以正常工作。如果您正在使用AJAX执行某些操作,它将不会更新,因为该表达式是在服务器端计算的。@mason我的客户端文件和服务器端文件都存储在同一个本地目录中。为什么我不能按需进行更改?目录与此无关。您需要了解页面生命周期过程。@dman2306每次selectCountMethod返回值更新时,它都会回发,但这是因为表中的参数发生了更改。这是不相关的,因为我不在后台使用它,我考虑过,但是客户端函数在
num
更新后运行,您认为仍然需要刷新客户端吗?然后您可以通过在浏览器中查看源代码来确认这一点。如果您看到“alert(“60”),那么您是不正确的——它在服务器更改它之前运行。如果您看到“警报(“7”),则它会在之后运行。“”代码是服务器端代码,在服务器上运行。我知道,如果我的变量是全局变量,则在回发时此值可能会更改,我确实尝试过使用hiddenfields(忘了提到这一点),但您无法访问由对象数据源调用的方法中的hiddenfields或任何其他控件。每次调用时,都会得到null。您确定,在任何服务器端方法上,如果调用
hdTimer.value
我都会获得正确的值。您需要更多的上下文。您是对的,在任何方法上您都可以使用它,但是当您调试在对象数据源使用的方法中调用的控制器时,您将得到一个null或至少我得到null值您是使用Web窗体还是模型视图控制器?我使用Web窗体:/I建议不要使用
ScriptManager
。这将弊大于利。但这可能会解决问题。你能详细说明危害吗?我已经用了很多年了,没有受到任何伤害。为什么不起作用?它显示了一个错误?值没有更改?没有显示错误,但如果更新了num,则在客户端,值保持不变。例如,如果初始值为10,然后更新为2
public int num = 60;    
public int SelectCountMethod()
    {                  
        num = SomeMethod(); //Returns int
        ScriptManager.RegisterStartupScript(this,
                                                        this.GetType(),
                                                        "Funct",
                                                        "myMsg = " + num + ";",
                                                        true);
        return num;
    }
//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;
        }
    }