0

我想从 Visual Studios 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 变量的任何其他方式也很好。任何输入或反馈将不胜感激。非常感谢您的宝贵时间。

4

1 回答 1

1

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

为此,您还可以使用 ASP.Net 功能,该功能允许您注册要在启动时调用的 javascript 代码。这是一个示例(在 VB.Net 中)。此代码将进入您的中继器的 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);
    }
}
于 2013-04-24T15:00:59.490 回答