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

3
我找到了一篇类似的文章,但并没有真正回答我的问题,或者他们回答了,但我没有理解。我读过的文章是这篇:为什么我通过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 的工具来实现。 - mason
我认为我们需要一个更现实的例子。如果使用PostBack,它应该可以正常工作。如果你正在使用AJAX进行某些操作,则不会更新,因为该表达式在服务器端被评估。 - dmeglio
@mason 我的客户端和服务器端文件都存储在同一个本地目录中。为什么我不能根据需要直接进行更改呢? - José Corretjer-Gómez
3
目录与此无关,你需要学习页面生命周期流程。 - mason
@dman2306 每次 selectCountMethod 返回值更新时,它都会进行回传,但这是因为表格上的参数已更改。这与我在回传时不使用此功能无关。 - José Corretjer-Gómez
显示剩余3条评论
5个回答

2

看一下你的客户端代码,“<%=num%>”实际上是在服务器上运行的。如果你在浏览器中查看源代码,你会看到:

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

正如您所看到的,没有变量需要更新。为了看到“60”变为“7”,您需要刷新客户端以获取服务器对“num”的新值。


我考虑过这个问题,但是客户端函数在num更新之后运行,你觉得还需要刷新客户端吗? - José Corretjer-Gómez
然后您可以通过在浏览器中查看源代码来确认。如果您看到'alert("60")',那么您是错误的--它在服务器更改之前运行。如果您看到'alert("7")',则它在之后运行。"<%=num%>"代码是服务器端代码并在服务器上运行。 - Russ

0

没有您的服务器端代码,我们将无法找到理想的解决方案。但是,您可以尝试以下方法:

  • 使用隐藏字段存储值。
  • 在页面中使用全局变量,将值传递给JavaScript中的全局变量。

最简单的方法是使用隐藏字段,原因是您可以轻松地在客户端和服务器上修改数据而不会出现任何实际问题。您需要确保不要过于频繁地修改状态。

<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)
{

}

所以这个全局变量将会保存这个值,但是当你在页面加载时重新初始化这个值,它将能够将更新后的值推送到你的JavaScript:

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

关键在于确保您正确地重新初始化值。

当您执行PostBack时,页面将被重新初始化,如果您不知道这一点,可能会修改您的值。这非常重要。


我正在使用网页表单:/ - José Corretjer-Gómez
为我定义“控制器”?如果您能提供更多上下文,我肯定可以帮助您。 - Greg
一个按钮、文本框、标签、隐藏字段。这些工具中的任何一个都是我所谓的控件,至少我的书是这样称呼它们的,哈哈。 - José Corretjer-Gómez
它们是“控件”,但“控制器”是不同的。这就是为什么我问的原因。你到底想要实现什么? - Greg
我尝试在数据绑定之后运行该行,例如在rowcommand上运行,结果得到10,因为每页有10行,但网格中的总行数为63。 - José Corretjer-Gómez
显示剩余11条评论

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()时,由于ScriptManager.RegisterStartupScript这一行代码,你的JS变量myMsg都会获得一个新值。

我建议不要使用ScriptManager。它会带来更多的问题而非好处,虽然这可能会潜在地解决一些问题。 - Greg
你能详细说明一下这种危害吗?我已经使用了好几年,没有遭受过任何损害。 - dmeglio
为什么不起作用?它显示错误吗?值没有改变? - Enrique Zavaleta
没有显示错误,但如果更新了num,在客户端上值仍然保持不变。例如,如果初始值为10,然后更新为20,在客户端上它仍然是10,但在服务器端它是20。顺便说一下,每次更新num时页面确实会重新加载,但我不评估post back,因为我不需要。 - José Corretjer-Gómez

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

0
使用HttpHandler和jQuery。Google是你的朋友,SO上也有几个例子。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接