通过javascript动态更改面板的样式

时间:2010-07-19 16:38:21

标签: c# javascript asp.net

我试图在用户点击添加按钮后显示一个新面板,由于某种原因这不起作用(它也会刷新页面,即使我的按钮返回true)我尝试了不同的方法,但是似乎没什么用。

<asp:Button ID="btnAdd" runat="server" Text="Add Property" CssClass="btn" OnClientClick="addProperty(); return false;"  />


 <script type="text/javascript">
    var num = 1;
    function addProperty()
    {
    num++;
    var panelName = "<%=pnlProperty"  + num.toString() + ".ClientID%>";
    alert(panelName);
    document.getElementById(panelName).style.display="inline";

    }
        </script>

任何帮助都会很棒!

2 个答案:

答案 0 :(得分:0)

你不能像那样交互javascript和ASP.NET。在将代码发送到javascript执行的客户端之前,ASP.NET将始终执行。您可以使用.NET 生成 javascript。

在您的情况下,这将在其他任何事情之前执行:

<%=pnlProperty" + num.toString() + ".ClientID%>

它不会在循环中执行,因为它在生成循环并发送到客户端之前作为ASP.NET代码执行。也不会使用javascript变量num的值来创建面板,因为javascript尚未开始执行。 <%,... %>中的所有内容都将被解释为.NET代码。所以.NET只会抛出一个错误,因为上面的代码并不准确。

您需要编写.NET代码,以便生成有意义的javascript。

你可以这样做:

var panels = [
   "<%= pnlProperty0.ClientID %>",
   "<%= pnlProperty1.ClientID %>",
   "<%= pnlProperty2.ClientID %>"
];

...可能会生成类似

的javascript
var panels = [
   "ctl00_main_pnlProperty0",
   "ctl00_main_pnlProperty1",
   "ctl00_main_pnlProperty2"
];

...这是一种创建字符串数组的完全准确的方法,然后您可以在javascript中使用

document.getElementById(panels[num]).style.display="inline";

如果你想要一个动态循环,你可能需要做类似

的事情
var panels = "<%
    String.Join(
        ",",
        Page.Controls.OfType<Panel>()
                     .Where(panel => panel.ID.StartsWith("pnlProperty"))
                     .Select(panel => panel.ClientID).ToArray());
%>";

...可能会创建像

这样的东西
var panels = "ctl00_main_pnlProperty0,ctl00_main_pnlProperty1,ctl00_main_pnlProperty2";

然后你可以做:

var panelNames = panels.split(',');
document.getElementById(panelNames[num]).style.display="inline";

答案 1 :(得分:0)

根据你的代码,普通的html按钮不会足够吗?

<input type="button" value="Add Property" onclick="addProperty();" />