Home > 语言编程 > [Asp.net]解决禁用JS后LinkButton无效问题

[Asp.net]解决禁用JS后LinkButton无效问题

Asp.net下的LinkButton相当于在普通的HyperLink基础上增加了OnClick事件功能,但是在Chrome或Firefox下分析自动生成的代码后发现,OnClick事件功能的实现是通过Javascript实现的,如果浏览器禁用了JS那么LinkButton就失效了。创建一个简单的LinkButton生成的代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<form method="post" action="Default.aspx" id="ctl01">
<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="/wEPDwULLTEwMzI1OTM3MzBkZK9/LQQOsKNii94hNCoPSshXh77HHPoJXeicAurCPOk/" />
</div> 
<script type="text/javascript">
//<![CDATA[
var theForm = document.forms['ctl01'];
if (!theForm) {
    theForm = document.ctl01;
}
function __doPostBack(eventTarget, eventArgument) {
    if (!theForm.onsubmit || (theForm.onsubmit() != false)) {
        theForm.__EVENTTARGET.value = eventTarget;
        theForm.__EVENTARGUMENT.value = eventArgument;
        theForm.submit();
    }
}
//]]>
</script>
    <a id="MainContent_LinkButton1" href="javascript:__doPostBack(&#39;ctl00$MainContent$LinkButton1&#39;,&#39;&#39;)">LinkButton1</a><br />
</form>

其中的href属性表面点击事件是通过向服务端postback来实现的。
href=“javascript:__doPostBack('ctl00$MainContent$LinkButton1','')”
通过分析以上代码可以得知,只需要向服务端传送两个控制参数即可通知服务端来处理点击事件,使用GET方式传值。因此可以使用以下代码

1
<a href="?__EVENTTARGET=ctl00$MainContent$LinkButton1&__EVENTARGUMENT=">Fake LinkButton1</a>

运行后发现点击我们创建的代码,服务端却报错了。原因是服务端启用了客户端事件验证,在ASP.net的aspx页面头部声明部分增加一段属性代码

EnableEventValidation=“false”

便可以关闭客户端事件验证。这样便可以不使用JS来实现对服务器事件的调用了。

完整代码
Default.aspx

1
2
3
4
5
6
7
8
9
<%@ Page Title=“Home Page" Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true"
    CodeFile="Default.aspx.cs" Inherits="_Default" EnableEventValidation="false" %>
 
<asp:Content ID="HeaderContent" runat="server" ContentPlaceHolderID="HeadContent">
</asp:Content>
<asp:Content ID="BodyContent" runat="server" ContentPlaceHolderID="MainContent">
    <asp:LinkButton ID="LinkButton1" runat="server" onclick="LinkButton1_Click1">Real LinkButton1</asp:LinkButton><br />
    <a href="?__EVENTTARGET=ctl00$MainContent$LinkButton1&__EVENTARGUMENT=">Fake LinkButton1</a>
</asp:Content>

Default.aspx.cs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
 
public partial class _Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
 
    }
 
    protected void LinkButton1_Click1(object sender, EventArgs e)
    {
        //这里是测试代码
        int a = 1;
        int b = 1;
    }
}
Categories: 语言编程 Tags: , , ,
  1. No comments yet.
  1. No trackbacks yet.