__doPostback

在.NET中,所有的服务器控件提交到服务器的时候,都会调用__doPostBack这个函数,所以灵活运用这个函数对于我们的帮助还是很大的。

比如,在我们写程序的时候经常会需要动态的生成一些控件,最简单的方法就是通过一个字符串,比如string strButton  =  <input type =”button” ID=”button1”>,然后输出到页面,但是如果我们需要这个控件来执行一些服务器的功能,就比较困难了。这里我们就可以用过借用__doPostBack这个函数来完成。接下来我觉个例子来说明一下具体如何调用。

既然要在服务器端运行那么,我们可以声明一个不可见的LinkButton控件,那通常,我们希望一个控件不可见,通常都是把visible属性设为false。但是在这里我们把LinkButton的Text属性设置为空,来是这个LinkButton不可见(为什么要这么设置,而不是直接设置visible属性,我会在下面说明),接下来我们可以在LinkButton里面写一些服务器端的代码。然后就是如何通过我们动态生成的客户端控件来调用LinkButton里面的功能,我们可以通过一个JavaScript函数来实现

function ExcuteOnServer()
{
  //第一个参数是你希望提交到服务器的控件的ID号,第二个参数是事件参数
   __doPostBack('LinkButtonID','');
}

接下去我们只需要在动态生成的这个Button控件的onclick事件中写上onclick=”JavaScript:ExcuteOnServer();“,这样当我们点击这个动态生成的客户端控件的时候,他便会执行LinkButton中的代码。

这样便实现了动态生成的客户端控件提交到服务器端的功能。

最后要说一下的就是为什么希望LinkButton控件不可见的时候,不是通过visible属性来完成的。因为当我们把visible属性设置为false的时候,浏览器在解析的时候,根本不会把这个控件放在页面上,也就是说这个控件是不存在的,所以我们在调用__doPostBack函数的时候,便会找不到控件。 

在项目中遇到很多地方需要做二次提交处理,经过研究和收集总结了客户端js利用__doPostBack(sender,args)函数来提交到服务器的方法。(不断补充中)

__doPostBack(sender,args)
sender:提交的控件
args:     事件参数。一般赋空值。

web.aspx页面上放置任何一个控件:<asp:button id="btnTest"/>

VB页面代码中在Page_Load中添加:Me.GetPostBackEventReference(btnTest)
注意该语句不要放在 IF Not IsPostBack Then  End IF 中。

C#中不需要上述步骤。

客户端调用js代码:__doPostBack("btnTest",""); 注意是双下划线。即可提交到服务器端。

调用该函数提交不会触发控件的任何js事件而直接进入服务器端。
可以利用该特性来做二次提交:
  在button控件的Click事件中做一个标记利用hidden控件或其他方式保存一个Flag
  __doPostBack提交则无此Flag
  服务器端则根据该Flag来判断是button提交还是__doPostBack提交。
注意在后台处理__doPostBack提交的逻辑中将Flag刷新

在Web自动化测试或爬虫中,模拟触发 `__doPostBack` 点击事件通常涉及对页面 JavaScript 逻辑的深入理解。`__doPostBack` 是 ASP.NET 中用于触发页面回发(Postback)的核心函数,其本质是一个 JavaScript 函数,用于向服务器提交页面数据并重新加载部分内容或整个页面[^1]。 ### 模拟触发 `__doPostBack` 的方法 #### 1. 直接调用 `__doPostBack` 函数 在自动化脚本中,可以通过执行 JavaScript 来直接调用 `__doPostBack` 函数。例如,在使用 Selenium 进行浏览器自动化时,可以使用如下代码: ```python from selenium import webdriver driver = webdriver.Chrome() driver.get("http://example.com") # 模拟调用 __doPostBack 函数 driver.execute_script("__doPostBack('ctl00$MainContent$Button1', '')") ``` 上述代码中,`execute_script` 方法用于执行页面上的 JavaScript 代码,其中 `'ctl00$MainContent$Button1'` 是触发回发的控件的 `UniqueID`,第二个参数通常为空字符串(用于传递事件参数)[^1]。 #### 2. 模拟点击控件 如果目标控件具有 `onclick` 事件,并且该事件调用了 `__doPostBack`,则可以直接通过自动化工具点击该控件。例如: ```python from selenium import webdriver driver = webdriver.Chrome() driver.get("http://example.com") # 找到按钮并点击 button = driver.find_element("name", "ctl00$MainContent$Button1") button.click() ``` 这种方式更接近用户行为,适用于大多数 ASP.NET Web Forms 控件。 #### 3. 使用 Headless 浏览器模拟 在爬虫场景中,可以使用 Headless 浏览器(如 Puppeteer 或 Playwright)来模拟完整的浏览器环境,并触发 `__doPostBack`。例如,使用 Puppeteer(Node.js): ```javascript const puppeteer = require('puppeteer'); (async () => { const browser = await puppeteer.launch({ headless: true }); const page = await browser.newPage(); await page.goto('http://example.com'); // 模拟点击按钮 await page.click('#ctl00_MainContent_Button1'); // 等待页面加载完成 await page.waitForNavigation(); // 获取页面内容 const content = await page.content(); console.log(content); await browser.close(); })(); ``` 此方法适合需要完整页面渲染和 JavaScript 执行的复杂场景。 ### 注意事项 - **参数识别**:`__doPostBack` 通常接受两个参数:控件的 `UniqueID` 和事件参数。可以通过浏览器开发者工具查看页面源代码,找到具体的参数值。 - **页面状态管理**:ASP.NET 页面在回发时会维护页面状态(ViewState),因此在自动化操作中需要确保页面状态正确传递。 - **事件验证**:某些页面可能启用 `EventValidation`,这会限制非法的回发事件。此时,需要确保发送的参数服务器端允许的范围内。 ### 示例:使用 Selenium 模拟 `__doPostBack` 并获取响应 ```python from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC driver = webdriver.Chrome() driver.get("http://example.com") # 等待页面加载完成 wait = WebDriverWait(driver, 10) wait.until(EC.presence_of_element_located((By.TAG_NAME, 'body'))) # 模拟触发 __doPostBack driver.execute_script("__doPostBack('ctl00$MainContent$Button1', '')") # 等待页面重新加载 wait.until(EC.staleness_of(driver.find_element(By.TAG_NAME, 'body'))) wait.until(EC.presence_of_element_located((By.TAG_NAME, 'body'))) # 获取更新后的内容 content = driver.page_source print(content) driver.quit() ``` ---
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值