【问题标题】:Passing a value to code behind function from var从 var 将值传递给函数背后的代码
【发布时间】:2015-04-10 11:12:36
【问题描述】:

我正在尝试将 pageIndex 变量从 javascript 传递给我的代码。如果我传递任何硬编码的值,代码就可以工作。但是,我无法使用 var 值让它工作。

 pageIndex++;
 var sPageIndex = pageIndex.toString;
 document.getElementById('<%= Label1.ClientID %>').innerHTML = '<%= xDoSomething(sPageIndex)%>';

这行得通:

document.getElementById('<%= Label1.ClientID %>').innerHTML = '<%= xDoSomething(123456)%>';

这是我在函数背后的简单代码:

Public Shared Function xDoSomething(sPageIndex As String) As String
        Dim ss As String = sPageIndex
        Try
            If ss.Length < 1 Then
                ss = "smaller than one"
            Else
                ss = ss
            End If
            Return "from code behind [" & ss & "]"

        Catch ex As Exception
            Return ex.ToString
        End Try
    End Function

看起来我试图传递的值没有访问权限!任何想法如何解决这个问题?

【问题讨论】:

  • 你需要了解服务器端和客户端的区别。您目前正在尝试将两者混合,并且(如您发现的那样)在这种情况下不起作用

标签: javascript jquery asp.net


【解决方案1】:

您需要了解服务器端和客户端之间的区别。目前,您正在以一种根本行不通的方式混合这两者。

pageIndex++;
var sPageIndex = pageIndex.toString;
document.getElementById('<%= Label1.ClientID %>').innerHTML = '<%= xDoSomething(sPageIndex)%>';

您在上面的代码中尝试做的是使用仅存在于客户端(即浏览器)上的变量作为服务器端(即在您的 IIS 服务器上)代码的一部分。

在服务器上 sPageIndex 不存在 - 它根本无法使用它,在浏览器上更改它不会有丝毫不同。

以下代码起作用的原因是您在服务器本身上为函数提供了123456 的值。服务器能够使用123456 的值并生成您想要的字符串。

document.getElementById('<%= Label1.ClientID %>').innerHTML = '<%= xDoSomething(123456)%>';

如果您需要 .innerHTML 基于客户端 sPageIndex 变量,您需要将该变量的值发送到服务器(通过查询字符串或表单),以便它可以处理它作为页面渲染的一部分...或者您可以查看 AJAX 之类的内容,这将允许您在后台转到服务器,获取 HTML 并根据需要显示它。

【讨论】:

  • 恐怕你的回答很正确。我不能使用 AJAX,因为这是一个 dotnetnuke 模块,从模块调用 web 方法非常复杂。您还有其他建议来完成这项工作吗?
  • 抱歉@always,dotnetnuke 100% 超出了我的知识范围(从未接触过,对此一无所知)。您是说不可能从客户端进行 AJAX 调用吗?该技术是否不允许您单独负责获取sPageIndex、运行服务器端功能并返回HTML 来制作不同的服务器端页面?
  • 我可以传递查询字符串等,但我想做的是避免回发。
  • @always,如果您无法使用 AJAX,那么回发是您唯一的选择。 xDoSomething 存在于服务器上,并且仅存在于服务器上。如果您需要调用它,您必须通过回发、AJAX、SignalR 等向服务器发送某种请求。
  • @always - 正如我所说,我对 dotnetnuke 一无所知,但如果你能够编写任何 javascript,那么我不明白你为什么不能调用 AJAX。是处理问题所在的服务器端请求吗? (我很想知道原因,我不是在批评你在说什么)
【解决方案2】:

你必须做字符串连接。

 pageIndex++;
 var sPageIndex = pageIndex.toString;
 document.getElementById('<%= Label1.ClientID %>').innerHTML = '<%= xDoSomething('+sPageIndex+')%>';

【讨论】:

  • 同上。 System.Web.HttpCompileException (0x80004005) ... 错误 BC30201:预期表达式。
【解决方案3】:

你试图传递的东西变成了一个字符串。 试试这个:

pageIndex++;
var sPageIndex = pageIndex;
document.getElementById('<%= Label1.ClientID %>').innerHTML = '<%= xDoSomething('+sPageIndex+')%>';

【讨论】:

  • 你添加了pageIndex++; var sPageIndex = pageIndex.toString;上面的线?而且我猜你不必做“toString”。
  • 它使我的页面完全失败。即使我将它与您编辑的版本一起传递。只有当我将它作为 '' 传递时它才有效
  • @Sourabh- 当您添加服务器标签 &lt;%= ... %&gt; 时,它会成为服务器控件,除非您要连接某些内容,否则无需在参数中添加 &lt;%= xDoSomething('+sPageIndex+')%&gt; 引号。 &lt;%= xDoSomething(sPageIndex)%&gt;这个是给服务器函数传参的正确方式。
  • @Suprabhat,我很想知道内联块如何成为服务器控件,请告诉我们更多信息。我也很想知道客户端 sPageIndex 如何在服务器端内联块中使用
  • @freefaller :感谢您的纠正,我非常了解内联代码块,但不知道我在评论时犯了这种错误。可能是因为一天压力很大:(。谢谢你承认我的错误:)
【解决方案4】:

您可以将服务器端功能设置为页面方法。下面的答案可能会有所帮助:

https://stackoverflow.com/a/27081733/4773711

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-20
    • 2013-09-23
    • 2014-09-26
    • 1970-01-01
    相关资源
    最近更新 更多