从asp转发器调用js函数

时间:2013-04-24 14:43:08

标签: javascript asp.net visual-studio asprepeater

我想在visual studio 2012中从aspx页面调用javascript函数。该函数从数据库获取7个值,任意次数并根据这些值更改css,以及更改每个值的div标记转发器的实例

<asp:Repeater ID="repModules" runat="server">
     <ItemTemplate>
         <div id="<%#Eval("ModuleID")%>" onload="callFunction()">
           //different div tags, which have their 
           //styles edited by the js function
         </div>
         <script  type="text/javascript">
          function callFunction() {
              go("M1", "name", "20", "0", "80", "50", "70");
          }
         </script>
     </ItemTemplate>
</asp:Repeater>

最终目标是从后面的aspx.net.cs页面获取变量,在函数中调用但它甚至不能正常工作。我试图在几个不同的地方和几个地方调用这个函数,并且已经坚持了一段时间了。 js脚本看起来像这样:

 function go(Id, name, eworth, eattained, worth, attained, progress) {
    //here the variables that are read in are 
    //assigned to variables defined in the js
 }

我的设置方式不是很好,我们可以通过javascript访问aspx变量。任何输入或反馈将不胜感激。非常感谢你的时间。

1 个答案:

答案 0 :(得分:1)

您正在为Repeater中的每一行声明相同的函数callFunction()。我没有这样做,而是在页面顶部声明一次。然后,在您的转发器中,调用该函数,从后面传入数据。

为此,您还可以使用ASP.Net功能,该功能允许您注册要在启动时调用的JavaScript代码。这是一个例子(在VB.Net中)。此代码将放在Repeater的ItemDataBound事件处理程序中。请注意,我正在调用“go()”函数而不是“callFunction()”函数。您不需要额外的功能,因为您可以直接调用“go()”。

Dim csm As ClientScriptManager = Page.ClientScript
Dim sb As New StringBuilder
sb.AppendLine("go(""M1"", ""name"", ""20"", ""0"", ""80"", ""50"", ""70"");")
csm.RegisterStartupScript(Page.GetType, "js_code_startup__unique_key", sb.ToString, True)

然后,您可以使用变量替换上面代码中的硬编码值。请注意,我使用两个双引号来转义sb.AppendLine调用中代码周围的双引号。

RegisterStartupScript调用中设置为True的第四个参数使其自动包含标记。

当页面加载时,此javascript代码将加载到页面底部并在遇到时执行。如果您愿意,可以尝试通过某种类型的onload函数调用它(可能在javascript中指定window.onload,或者使用jQuery document.ready)。

如果您不想使用ItemDataBound事件处理程序,您可能只是直接在脚本标记中调用该函数(尽管如果并非所有需要的项都在执行时加载,则可能会出现问题) 。要从数据库中获取值,您可能需要进行数据绑定,因此您必须执行类似于函数调用中第一个参数的操作。

<script  type="text/javascript">
    go('<%# Eval("YourVarName") %>', "name", "20", "0", "80", "50", "70");
</script>

更新 - 将代码转换为C#

我对C#并不熟悉,但这就是我认为的结果。我把它放在ItemDataBound事件处理程序中。我没有测试过这个,所以我不确定它是100%准确的。

protected void repModules_ItemDataBound(object sender, System.Web.UI.WebControls.RepeaterItemEventArgs e){ 
    if (((e.Item.ItemType == ListItemType.Item) || (e.Item.ItemType == ListItemType.AlternatingItem))) {  
        ClientScriptManager csm = Page.ClientScript;
        StringBuilder sb = new StringBuilder();
        sb.AppendLine("go(\"M1\", \"name\", \"20\", \"0\", \"80\", \"50\", \"70\");");
        csm.RegisterStartupScript(Page.GetType, "js_code_startup__unique_key", sb.ToString, true);
    }
}