Javascript 防止OnServer在OnClick中单击?

Javascript 防止OnServer在OnClick中单击?,javascript,asp.net,onclick,postback,dom-events,Javascript,Asp.net,Onclick,Postback,Dom Events,我使用的是ASP.NET,我有一个包含onclick和onserverclick的链接。两者都很重要,但我希望onclick尽可能防止onserverclick运行 以下是我目前正在玩的项目: <ul class="clickables"> <asp:Repeater ID="MenuRepeater" runat="server"> <HeaderTemplate> </Heade

我使用的是ASP.NET,我有一个包含onclick和onserverclick的链接。两者都很重要,但我希望onclick尽可能防止onserverclick运行

以下是我目前正在玩的项目:

    <ul class="clickables">
        <asp:Repeater ID="MenuRepeater" runat="server">
            <HeaderTemplate>
            </HeaderTemplate>
            <ItemTemplate>
                <li class=" <%# ((DataRowView)Container.DataItem)["CSSClass"]%>" 
                    style="background-color: <%# ((DataRowView)Container.DataItem)["BackgroundColour"]%>">
                    <a id="A1" 
                        runat="server" 
                        onserverclick="LinkClick"
                        onclick=<%# "return javascript:LinkClick('" + ((DataRowView)Container.DataItem)["Postback"] + "')" %>
                        customid='<%# ((DataRowView)Container.DataItem)["UniqueID"]%>'
                        href='<%# ((DataRowView)Container.DataItem)["PageFile"]%>'>
                    </a>
                    <%# ((DataRowView)Container.DataItem)["DisplayName"]%>
                </li>
            </ItemTemplate>
            <FooterTemplate>
            </FooterTemplate>
        </asp:Repeater>
    </ul>
我错过什么了吗?这可能吗?我知道我可以通过在onclick中返回false来阻止正常的回发,但是我可以停止onserverclick吗

更新 在调试了一段时间后,我们离开了webdev…,JS函数没有启动

更新2

以下是完整呈现的页面源:

<!DOCTYPE html>
<link rel="stylesheet" type="text/css"
    href="iphone.css" />

<link href="MenuStyles.css" rel="stylesheet" type="text/css">
<meta name="viewport" content="user-scalable=no, width=device-width" />
<script type="text/javascript" src="mootools-core-1.4.5-full-nocompat-yc.js"></script>
<html xmlns="http://www.w3.org/1999/xhtml">
<head><title>

</title></head>
<body>
    <form method="post" action="Main.aspx" id="form1">
<div class="aspNetHidden">
<input type="hidden" name="__EVENTTARGET" id="__EVENTTARGET" value="" />
<input type="hidden" name="__EVENTARGUMENT" id="__EVENTARGUMENT" value="" />
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="YkYtJBVbLo0YmPPXHO5sO8FI5kAxszDeDe/bdeHgDCummp4bGaZKj3W6ihINzdq9PFQT6uCqE2eRXLhF1OEeKh8qJgRJnXWiisrDZ2ivw6JISfxuhIFP1VKKrZET9NIJqrJKpS2namuXzQL+yDJG8WGGvDrQ7oEBMDT6seSXr3zoowlA6tB4+gdbsPJ4utvNKCrhhTImpeXTzeaYCNV3t8QzsiGA7wK51Pgqo9vFQ6LH31NRYJEJ/yfhnnUcoSG6YR8SHNp+j7cGMVMoZPpgLu4bcMNSixHjGW+yin4YN7sf4wtXqQHIGFOwbSHM0VcAxd3is4lUJVYMoBH4pqAjjgBZMuaXPHwDfmZZk3Dk8feyn2btCh0nwXUrkAiAf8n1+a3hs9VfR0JeNs6x0WVzlMxgm4JFzIkthXtJ+632NaNh4rJyvib+j/Vs+HjtRFQXaIDj1fXp2KFniReSjZANiBaepyJqozJghhYnEB8MP1ZOePmrrbLCxUl1MD5Wn2bgFKkNSK25NC1hQoXdnZbEeA==" />
</div>

<script type="text/javascript">
//<![CDATA[
var theForm = document.forms['form1'];
if (!theForm) {
    theForm = document.form1;
}
function __doPostBack(eventTarget, eventArgument) {
    if (!theForm.onsubmit || (theForm.onsubmit() != false)) {
        theForm.__EVENTTARGET.value = eventTarget;
        theForm.__EVENTARGUMENT.value = eventArgument;
        theForm.submit();
    }
}
//]]>
</script>


<div class="aspNetHidden">

    <input type="hidden" name="__EVENTVALIDATION" id="__EVENTVALIDATION" value="zxCYbgjQBAQXVsCg6EwWqRNbeqa/5PzOIgwdhVB5mEasbEk06ik+VT9njAhsM8vF0ymfwdsNmbuX2R7iMJjdpqLMAVABvva4eorpK2PdajpD+g2RzFXI5SEEG9VjwQUXf3kKgb0KnPjWGYQdgZHGDQ==" />
</div>
    <div>
        <div class="button">Back</div>
        <div class="button-bold">+</div>
        <h1>AAR</h1>
        <h2 id="lblQuestion">Please wait for a question...</h2>
        <ul class="clickables">


                    <li class=" arrow" 
                        style="background-color: White">
                        <a id="MenuRepeater_A1_0" onclick="return&#32;LinkClick(&#39;True&#39;)" customid="80f03602-cb67-4d46-99ea-4200459e6a48" href="javascript:__doPostBack(&#39;MenuRepeater$ctl01$A1&#39;,&#39;&#39;)">
                        </a>
                        Question 1
                    </li>

                    <li class=" " 
                        style="background-color: LightGray">
                        <a id="MenuRepeater_A1_1" onclick="return&#32;LinkClick(&#39;False&#39;)" customid="91f76613-ecaa-47df-a5d6-5a921935b1f9" href="javascript:__doPostBack(&#39;MenuRepeater$ctl02$A1&#39;,&#39;&#39;)">
                        </a>
                        Question 2
                    </li>


        </ul>
        <ul class="clickables">

        </ul>
    </div>
    </form>
    <script>
        $$('.clickables').each(function(clickable) {
            var list = clickable.getElements('li');

            list.addEvent('click', function() {
                var link = this.getElement('a');
                if(this.getFirst('a')) {
                    window.location = link;
                }
            });
        });

        function LinkClick(parameters) {
            if (parameters[0] == "False") {
                return false;
            }
            return true;
        }
    </script>
</body>
</html>

我仍然得到:

onclick="return&#32;LinkClick(&#39;True&#39;)"
编辑4

以下是当前渲染的源:

<!DOCTYPE html>
<link rel="stylesheet" type="text/css"
    href="iphone.css" />

<link href="MenuStyles.css" rel="stylesheet" type="text/css">
<meta name="viewport" content="user-scalable=no, width=device-width" />
<script type="text/javascript" src="mootools-core-1.4.5-full-nocompat-yc.js"></script>
<html xmlns="http://www.w3.org/1999/xhtml">
<head><title>

</title></head>
<body>
    <form method="post" action="Main.aspx" id="form1">
<div class="aspNetHidden">
<input type="hidden" name="__EVENTTARGET" id="__EVENTTARGET" value="" />
<input type="hidden" name="__EVENTARGUMENT" id="__EVENTARGUMENT" value="" />
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="ATtNaDBRU6vswFif62qens2E35fTb32GNoGWb9g2UFbg0Pli0sVNrzGeLKgFI41ojer32c0dUpY2F54DIn0L0dQgi7XFwJCum71RivEO8THI+xsj3ACip5IKj0hPTlB0mDtjRUcRAPxTUDJlxNB2ZvpP1nAR8i7b/tsSrF5sP3Xx3JOb59POn4nxVDOTm80j0OAolK09Mo0leI9EzyQWbpig8Q8FaT7eKzCoJ1Z40TNWX24ZKsxsND4ebBfakOnI8qd2lNdBcJ9FrhBCTEJDCQksXs/rhyJXkksaonPGNFdtWMpiIyQDGkT0V6Q+CPt5fFnZZp4fbKZyRVMcs6XdxwHG3qTYJJgnDbfSvnswKce7la8JVSxoWy+dufG6gxIfJK2rKw0mhfQ21y90ZtkaKZ4CeZWB4TveHRhYJVlinC7bwXwKJGXhqcHJeJ0IoinTS+ZgsbuJOo3zHCslpWThP+ib7IVpmFx+nluy31L65Zy7dVoSZeySboBq10C9e1D3Tm0K5Pvcn/ovG7NmRupa+vgrcYEWQgb6QKym1aartoVmtPm1dWZiJzwA9X7j7Wn5mus2XrE5SXqbvp0bANO1rQ==" />
</div>

<script type="text/javascript">
//<![CDATA[
var theForm = document.forms['form1'];
if (!theForm) {
    theForm = document.form1;
}
function __doPostBack(eventTarget, eventArgument) {
    if (!theForm.onsubmit || (theForm.onsubmit() != false)) {
        theForm.__EVENTTARGET.value = eventTarget;
        theForm.__EVENTARGUMENT.value = eventArgument;
        theForm.submit();
    }
}
//]]>
</script>


<div class="aspNetHidden">

    <input type="hidden" name="__EVENTVALIDATION" id="__EVENTVALIDATION" value="vi/Uef51SWAjwpFRuN3fwE5Y2FDB84KMHL6HjRIbWSKMEsSrg2RiGbteExTKFCbKhGe16A7xsn6DzMULMalMxqrg2yi9wkWZb0w2ifgCG6mmU0fH3V6zELQeACrtHDQ+4YlxeZ8k7HfGC592ammq3g==" />
</div>
    <div>
        <div class="button">Back</div>
        <div class="button-bold">+</div>
        <h1>AAR</h1>
        <h2 id="lblQuestion">Please wait for the question...</h2>
        <ul class="clickables">


                    <li class=" arrow" 
                        style="background-color: White">
                        <a id="MenuRepeater_A1_0" onclick="return LinkClick(True);" customid="b88d214b-0d1c-4986-821e-c1650ffbdbfd" href="javascript:__doPostBack(&#39;MenuRepeater$ctl01$A1&#39;,&#39;&#39;)">
                        </a>
                        Question 1
                    </li>

                    <li class=" " 
                        style="background-color: LightGray">
                        <a id="MenuRepeater_A1_1" onclick="return LinkClick(False);" customid="d566775f-4bee-4069-adb0-27e8cf8057d9" href="javascript:__doPostBack(&#39;MenuRepeater$ctl02$A1&#39;,&#39;&#39;)">
                        </a>
                        Question 2
                    </li>


        </ul>
        <ul class="clickables">



        </ul>
    </div>
    </form>
    <script>
        $$('.clickables').each(function(clickable) {
            var list = clickable.getElements('li');

            list.addEvent('click', function() {
                var link = this.getElement('a');
                if(this.getFirst('a')) {
                    window.location = link;
                }
            });
        });

        function LinkClick(parameters) {
            if (parameters[0] == "False") {
                return false;
            }
            return true;
        }
    </script>
</body>
</html>
更新5

因此,如果我离开该方法并只返回true/false,它应该停止回发吗?这在渲染源中不起作用

<!DOCTYPE html>
<link rel="stylesheet" type="text/css"
    href="iphone.css" />

<link href="MenuStyles.css" rel="stylesheet" type="text/css">
<meta name="viewport" content="user-scalable=no, width=device-width" />
<script type="text/javascript" src="mootools-core-1.4.5-full-nocompat-yc.js"></script>
<html xmlns="http://www.w3.org/1999/xhtml">
<head><title>

</title></head>
<body>
    <script>
        function LinkClick(parameters) {
            if (parameters[0] == "False") {
                return false;
            }
            return true;
        }
    </script>
    <form method="post" action="Main.aspx" id="form1">
<div class="aspNetHidden">
<input type="hidden" name="__EVENTTARGET" id="__EVENTTARGET" value="" />
<input type="hidden" name="__EVENTARGUMENT" id="__EVENTARGUMENT" value="" />
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="PiZp7nhFhCoiWV3slT5szv5Z5GAkeDWYHj7QpAPmnwSoKxWg6Zm9HTQGkZXS2Osddx6KwS0eGu/ZMaLjgxVBm1U+Eszzf/OjmAbB78jPAeSwW8GwXRUUp984a7cPZc9cYajKHkhBVtuuALV6HSsT3oRzEPlziohjgWGiV8HFAEOd1CWTj+RAC3B/mWcmrFcexzpR1XhQgnV5LQC7GplUB9Y2E/rb8MFQHfYsRxG5GjWJ5zqe51FhwstLL/dbSklaBkRlFHyFyZNUeA74My6AHCOAWbUjZ42sVcMjaSVnM1zZsxQtSG8+UdbshaLZ9Gz5SOB0Vq4fS8J+TrUlswsSLqQ77Q+m2ouZG+jhPf7jKC59KvIYGlKHkgYVqCvhqhkIG91xg7k9M3f5KAf0yOB6yaesVxnWBCC+UQWcKRePIV9tq2eE8C+8F+rLCPJ6RXgUzpC+DvVmlQMHzmiXWLehtymb2HRX4O/2RUJxLDlVP/8=" />
</div>

<script type="text/javascript">
//<![CDATA[
var theForm = document.forms['form1'];
if (!theForm) {
    theForm = document.form1;
}
function __doPostBack(eventTarget, eventArgument) {
    if (!theForm.onsubmit || (theForm.onsubmit() != false)) {
        theForm.__EVENTTARGET.value = eventTarget;
        theForm.__EVENTARGUMENT.value = eventArgument;
        theForm.submit();
    }
}
//]]>
</script>


<div class="aspNetHidden">

    <input type="hidden" name="__EVENTVALIDATION" id="__EVENTVALIDATION" value="aQDXp34k4YJiEBt3URBFL0do/c8NXsEmuBtFz8JLRhtXerYXPFYRZmyXIpCef68aO7itJ4EUwQ9eXl2KkxDndTmS4149nNN8BX3AoFLDgB0b4w6cNsn3nzoZ3ENnU4vExyeHdXVJyyVwmZruhoQ7GA==" />
</div>
    <div>
        <div class="button">Back</div>
        <div class="button-bold">+</div>
        <h1>AAR</h1>
        <h2 id="lblQuestion">Please wait for a question...</h2>
        <ul class="clickables">


                    <li class=" arrow"
                        style="background-color: White">
                        <a id="MenuRepeater_A1_0" onclick="return true;" customid="b88d214b-0d1c-4986-821e-c1650ffbdbfd" href="javascript:__doPostBack(&#39;MenuRepeater$ctl01$A1&#39;,&#39;&#39;)"></a>
                        Question 1
                    </li>

                    <li class=" "
                        style="background-color: LightGray">
                        <a id="MenuRepeater_A1_1" onclick="return false;" customid="d566775f-4bee-4069-adb0-27e8cf8057d9" href="javascript:__doPostBack(&#39;MenuRepeater$ctl02$A1&#39;,&#39;&#39;)"></a>
                        Question 2
                    </li>


        </ul>
        <ul class="clickables">

        </ul>
    </div>
    </form>
    <script>
        $$('.clickables').each(function (clickable) {
            var list = clickable.getElements('li');

            list.addEvent('click', function () {
                var link = this.getElement('a');
                if (this.getFirst('a')) {
                    window.location = link;
                }
            });
        });
    </script>
</body>
</html>

您是否检查过参数[0]==False?可能是字符串比较问题?也可能是您的文本实际上在链接标记之外:

<a id="A1" 
    runat="server" 
    onserverclick="LinkClick"
    onclick=<%# "return javascript:LinkClick('" + ((DataRowView)Container.DataItem)["Postback"] + "')" %>
    customid='<%# ((DataRowView)Container.DataItem)["UniqueID"]%>'
    href='<%# ((DataRowView)Container.DataItem)["PageFile"]%>'>
</a>
<%# ((DataRowView)Container.DataItem)["DisplayName"]%>
应该是:

<a id="A1" 
    runat="server" 
    onserverclick="LinkClick"
    onclick=<%# "return javascript:LinkClick('" + ((DataRowView)Container.DataItem)["Postback"] + "')" %>
    customid='<%# ((DataRowView)Container.DataItem)["UniqueID"]%>'
    href='<%# ((DataRowView)Container.DataItem)["PageFile"]%>'>
    <%# ((DataRowView)Container.DataItem)["DisplayName"]%>
</a>
您不应该执行onclick=,因为这会自动对输出进行编码

应该是这样的:

<a onclick="javascript:return LinkClick('<%# ((DataRowView)Container.DataItem)["Postback"] %>')" href="something"></a>
您的输出返回&32;LinkClick&39;真&39;甚至不是javascript调用。这就是为什么你看不到任何错误

有关于asp.net内联表达式的有用链接:
非常感谢大家的帮助。问题是.NET内置的XSS东西,通过配置文件自动与您发生冲突

一旦我删除了这行代码,我想我把我的服务器变量放入JS的方式会让我的站点认为它受到了攻击。。。无论如何,它将是一个私有站点,所以XSS将被关闭。如果有人能找到一个更好的解决方案,那么请张贴,我会尝试一下

<httpRuntime requestValidationMode="4.5" targetFramework="4.5" encoderType="System.Web.Security.AntiXss.AntiXssEncoder, System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />

^^从Web.config中删除这一行将自担风险…

如果我理解您的问题,那么由于onclick事件中发生的某些事情而抑制onserver单击非常简单:

<span class="psw">Forgot <a href="" runat="server" onclick="return checkForRequiredEmailAddress();" onserverclick="ForgotPassword">password?</a></span>
这是我的一个页面上的一个实际忘记密码链接。除非存在有效的电子邮件地址,否则不会触发onserverclick事件中指定的密码隐藏ForgotPassword方法

“CheckForRequiredMailAddress”方法检查其存在性、结构和正确性,然后根据检查结果返回true或false


我知道你的问题说你试过这个,但它肯定对我有效,所以我只能假设它是愚蠢的。单击事件中缺少的分号可能会有所不同。

该元素在浏览器中的呈现方式如何?我使用CSS将其呈现为菜单。。。我已经更新了我的代码,在LI项目周围添加了一点额外的内容。对不起,我删除了最后的评论,因为我在发布后阅读了其他答案。。。最后一件事,用代替?@CrisimIlNumenoreano,运气不好。。最后一件事呢?该死我想这一次我需要史酷比的工作人员…我必须在23:17在意大利这里睡觉,但是最后一件事,为什么不试着用这个代替呢?祝未解决的先生好运我已经用更多的细节更新了我的问题。DisplayName标记应该在它所在的位置,因此它作为li文本而不是a文本的一部分呈现。但是,是什么赋予了a标记任何维度?我不确定这是什么意思。我刚刚又更新了我的问题,问题似乎是JS没有开火。。。我一定是哪里出了什么问题…服务器端的点击触发了吗?也就是说,页面是否回发?我所说的“维度”是指a标记中没有任何内容,它没有宽度或高度,因此无法单击。请尝试将文本放入a标记中,看看它是否有效。您好,您的html无效,服务器标记的格式不正确。是的,这是一个简单的示例,但解释了问题。这就是用包装完整的属性值。我想这很清楚。@nNenad-我明白你在说什么,但据我所知,没有可能按照你的方式去做。我把整个东西都包在标签里,因为我不得不这么做。如果我没有,我会得到上面的标签错误。Ups,修正了打字错误。不管用,嗯。不知道你是如何树立榜样的。在最坏的情况下,您可以使用,但在这种情况下,您必须确保正确地使用Html编码的数据。关于内联表达式的使用有一个很好的链接,我刚刚把它添加到帖子中。即使只是直接调用,我也会得到html实体代码。。。这太疯狂了。谢谢你的链接,我会仔细阅读,看看它是否有帮助,但由于一个普通的电话不起作用,我不知道该怎么办!很高兴看到你发现了这个问题!在我之前的评论中,我说的是用“因为我已经挖掘了我知道的所有论坛的类似问题,并且没有标签样本,所以我认为可能存在一些相关问题…”。。。我大错特错了,请接受我的建议apologize@CrisimIlNumenoreano-没必要道歉,你坐在这里是为了帮我,太神奇了!非常感谢你们的帮助,如果你们不是都在附近的话 他不停地问问题,告诉我尝试一些我从未发现的问题。我仍然想找到一种比禁用XSS更好的方法,尽管它对我来说很有效,但如果我将它标记为答案,可能会有人在不考虑后果的情况下这么做!:让我们再次感谢你!!!:D
<a onclick="javascript:return LinkClick('<%# ((DataRowView)Container.DataItem)["Postback"] %>')" href="something"></a>
<httpRuntime requestValidationMode="4.5" targetFramework="4.5" encoderType="System.Web.Security.AntiXss.AntiXssEncoder, System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<span class="psw">Forgot <a href="" runat="server" onclick="return checkForRequiredEmailAddress();" onserverclick="ForgotPassword">password?</a></span>