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

时间:2015-04-15 20:45:24

标签: javascript c# asp.net webforms objectdatasource

我看起来只发现了一个类似的帖子并没有真正回答我的问题,或者他们做了但我没理解。我读到的帖子就是这个: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返回60,然后此值更新为7.在服务器端num等于7但在客户端它仍然是60.是有没有办法更新客户端的价值?

我为我糟糕的打字技巧道歉,英语不是我的母语。 一些例子可能会有所帮助,并提前感谢。

我注意到在更新此变量的地方(在selectCount方法或任何其他方法上)并不重要,在客户端没有更新。

5 个答案:

答案 0 :(得分:2)

查看您的客户端代码,“&lt;%= num%&gt;”实际上是在服务器上运行的。如果您在浏览器中检查了源代码,那么您将看到:

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

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

答案 1 :(得分:0)

如果没有服务器端代码,我们将无法找到理想的解决方案。但是,您可以执行以下操作:

  • 使用隐藏字段存储值。
  • 为页面使用全局变量,将值传递给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)
{

}

因此,此全局将保留该值,但是当您重新初始化Page Load处的值时,它将能够将更新后的值推送到您的JavaScript:

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

关键是,确保正确重新初始化价值。

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

答案 2 :(得分: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()时,由于行myMsg

,您的JS变量ScriptManager.RegisterStartupScript都会获得一个新值

答案 3 :(得分:0)

使用HttpHandler和jQuery。谷歌是你的朋友,SO也有几个例子。

答案 4 :(得分: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;
        }
    }