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;
        }
    }