前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >c#以POST方式模拟提交表单

c#以POST方式模拟提交表单

作者头像
庞小明
发布于 2018-03-29 05:27:11
发布于 2018-03-29 05:27:11
2.3K0
举报
文章被收录于专栏:pangguomingpangguoming

这是我一年前写的一个用C#模拟以POST方式提交表单的代码,现在记录在下面,以免忘记咯。那时候刚学C#~忽忽。。很生疏。。代码看上去也很幼稚 臃肿不堪

#region 内容添加函数(Contentinsert)      public string Contentinsert(string bookID, string bookTitle, string bookContent,string taskUrl,string Ztagend)      {                 string uriString = "这里是取VIEWSTATE等值的页面";

         //如果是asp.net页面,最好是先取到VIEWSTATE和EVENTVALIDATION值一并提交                  ///////////////////////////////////////                  // 打开指定的页面                  ///////////////////////////////////////                 XMLRW UpdateBook = new XMLRW();                  WebClient webClient = new WebClient();                  byte[] responseData = webClient.DownloadData(uriString);                  string srcString = Encoding.UTF8.GetString(responseData);                  ///////////////////////////////////////                  // 填写页面并提交                  ///////////////////////////////////////                  webClient = new WebClient();                  webClient.Headers.Add("Content-Type", "application/x-www-form-urlencoded"); //定义关联的标头

                // 获取页面的 VeiwState   这个值和EventValidation 的值在这里用于数据接收页接收数据                              string viewStateFlag = "id=\"__VIEWSTATE\" value=\""; //动态抓取__VIEWSTATE的值                  int i = srcString.IndexOf(viewStateFlag) + viewStateFlag.Length;                  int j = srcString.IndexOf("\"",i);                  string viewState = srcString.Substring(i, j-i);

                // 获取页面的 EventValidation 这个值和EventValidation 的值在这里用于数据接收页接收数据          string eventValidationFlag = "id=\"__EVENTVALIDATION\" value=\""; //动态抓取__EVENTVALIDATION\的值                 i = srcString.IndexOf(eventValidationFlag) + eventValidationFlag.Length;                  j = srcString.IndexOf("\"", i);                  string eventValidation = srcString.Substring(i, j - i);          //获取页面的章数                  string viewmenuid = "<input name=\"txt_menuid\" type=\"text\" value=\""; //动态抓取__VIEWSTATE的值                   i = srcString.IndexOf(viewmenuid) + viewmenuid.Length;                   j = srcString.IndexOf("\"",i);                  string txt_menuid = srcString.Substring(i, j-i);                  /* 提交按钮的文本                  string submitButton = "提交";                   * 这句代码主要用于当数据接收页面是button的情况                   * */                  bookTitle = System.Web.HttpUtility.UrlEncode(bookTitle);                  bookContent = System.Web.HttpUtility.UrlEncode(bookContent);                  viewState = System.Web.HttpUtility.UrlEncode(viewState);                  eventValidation = System.Web.HttpUtility.UrlEncode(eventValidation);                  txt_menuid = System.Web.HttpUtility.UrlEncode(txt_menuid);                   // 要提交的字符串数据。格式形如:user=uesr1&password=123                  //下面开始执行数据的提交 当提交没有错误将返回提交后的页面代码回来                  string postString = "txt_title=" + bookTitle + "&txt_content=" + bookContent + "&txt_menuid=" + txt_menuid + "&cmdSaveConn.x=0&cmdSaveConn.y=0" + "&__VIEWSTATE=" + viewState + "&__EVENTVALIDATION=" + eventValidation;            /*txt_title为标题内容,bookContent为内容txt_menuid为当前章节数cmdSaveConn.x=0&cmdSaveConn.y=0用于传递imagebutton控件传递参数 用于数据接收页面的提交针对不同的按钮用参数实现触发祥见:http://hi.baidu.com/zeratul_bb/blog/item/34d9f7fda770c241d6887deb.html __VIEWSTATE和_EVENTVALIDATION是asp.net特有的隐藏值传递,目前认为作用在于传递数据~待查*/                  // 将字符串转换成字节数组                  byte[] postData = Encoding.ASCII.GetBytes(postString);                  // 上传数据,返回页面的字节数组                  responseData = webClient.UploadData(uriString, "POST", postData); //本函数的核心,这里主要解决了用POST方法传递数据以模拟表单提交~还有就是避免了提交后返回到数据接收指定的页面~是个很好的方法!!详见:http://www.cnblogs.com/anjou/archive/2006/12/25/602943.html (asp.net中webClient填充和提交表单的方法!)                  // 将返回的将字节数组转换成字符串(HTML);                  // ASP.NET 返回的页面一般是Unicode,如果是简体中文应使用                  //   Encoding.GetEncoding("GB2312").GetString(responseData)                  srcString = Encoding.UTF8.GetString(responseData);                  UpdateBook.UpdateXml(taskUrl, bookID, Ztagend);                  return "成功添加数据,返回数据字节为:"+srcString.Length.ToString(); //向主调函数返回数据提交后转到的页面代码长度!

                ///////////////////////////////////////                  // 分析返回的页面                  ///////////////////////////////////////                  // ...... ......  }      #endregion

-----------------------------

根据不同按钮总结如下:

Asp.net 中在客户端触发服务端事件分为两种情况:

一.     WebControls中的Button 和HtmlControls中的Type为submit的HtmlInputButton

这两种按钮最终到客户端的表现形式为: <input name="Submit1" id="Submit1" type="submit" value=”Submit”>,这是Form表单的提交按钮,点击以后会作为参数发送到服务端,参数是这样的: 控件的name属性=控件的value值,对应上面的例子就是:Submit1= Submit。 服务端会根据接收到的控件的name属性的这个key来得知是这个按钮被点击了,从而在服务端触发这个按钮的点击事件。

二.     ImageButton或者HttpInputImage:

这些控件到客户端的表现类似这样的: <input type=image id=img1>,点击了这样的控件会直接提交表单,作用同提交按钮。点击了这样的控件传到服务端的参数是这样的:id.x=nn&id.y=nn,对应到上面的例子就是:img1.x=nn&img1.y=nn

三.     HtmlControls 中的 Type为button的HtmlInputButton 和其它所有的控件事件,比如LinkButton点击,TextBox的Change事件等等:

这些事件在客户端产生后会经过一个统一的机制发送到服务端。

1.       首先asp.net页框架会使用两个Hidden域来存放表示是哪个控件触发的事件,以及事件的参数:

<!—表示触发事件的控件,一般是这个控件的name -->

<input type="hidden" name="__EVENTTARGET" value="" />

<!—表示触发事件的参数,一般是当某个控件有两个以上的事件时,用来区别是哪个事件 -->

<input type="hidden" name="__EVENTARGUMENT" value="" />

2.       服务端会生成一个jscript的方法来处理所有这些事件的发送,这段代码是:

<script language="javascript">

<!--

function __doPostBack(eventTarget, eventArgument) {

         var theform = document.WebForm2;

         theform.__EVENTTARGET.value = eventTarget;

         theform.__EVENTARGUMENT.value = eventArgument;

         theform.submit();

}

// -->

</script>

3.       每个会引发服务端事件的控件都会在响应的客户端事件中调用上面的代码:

比如,HtmlControls 中的 Type为button的HtmlInputButton的点击事件

<!—客户端的点击事件调用__doPostBack,eventTarget 参数为'Button2',表示是name为'Button2’控件触发的事件,eventArgument 为空,表示这个Type为button的HtmlInputButton只有一个客户端触发的服务端事件-->

<input language="javascript" onclick="__doPostBack('Button2','')" name="Button2" id="Button2" type="button" value="Button" />

又比如,TextBox控件的Change事件

<!—客户端的onchange事件调用__doPostBack,eventTarget 参数为’TextBox1’,表示是name为’TextBox1’控件触发的事件,而TextBox控件只有一个客户端触发的服务端事件TextChanged,故服务器就会去触发这个TextBox的TextChanged事件->

<input name="TextBox1" type="text" id="TextBox1" onchange="__doPostBack('TextBox1','')" language="javascript" />

4.       客户端触发事件后调用__doPostBack方法,将表示触发的控件源的eventTarget 和事件参数eventArgument分别付给两个隐藏域__EVENTTARGET和__EVENTARGUMENT,然后提交Form,在服务端根据__EVENTTARGET和__EVENTARGUMENT来判断是哪个控件的什么事件触发了。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-03-28 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
浅谈ASP.NET的Postback
说道ASP.NET的Postback,就得说Web Page的生命周期,但是Web Page的生命周期却不是三言两语就能够说得清楚的,所以在这里单纯站的编程的角度,撇开Web Page 的生命周期浅谈Postback。 我们知道,无论是ASP.NET1.x,2.0,甚至是以后的版本,ASP.NET最终Render到Client端通过浏览器浏览的都是一样:一个单纯的HTML。Client通过Submit Form的方式将填入Form的数据提交给Server进行处理。我们现在来看看ASP.NET整个Postba
蒋金楠
2018/01/16
1.2K0
浅谈ASP.NET的Postback
__dopostback的用法
转载:http://blog.csdn.net/fwj380891124/article/details/8819926
跟着阿笨一起玩NET
2018/09/20
8310
ASP.NET:创建Linked ValidationSummary, 深入理解ASP.NET的Validation
我想对于ASP.NET的Validator控件已经熟悉的不能再熟悉了。我们 已经习惯了用Validator控件来验证我们在表单的输入,并通过ValidationSummary来输出我们为Validator控件设置的Error message。不知道大家有没想过进一步改进一下我们的Validation来改善我们的User Experience。比如,在ValidationSummary输出一个Link连接到对应的控件,而不是显示单纯的Error message。 比如在上图中,是一个典型的Logi
蒋金楠
2018/02/07
2.7K0
ASP.NET:创建Linked ValidationSummary, 深入理解ASP.NET的Validation
Page.ClientScript.RegisterStartupScript() 方法「建议收藏」
Page.ClientScript.RegisterStartupScript() 方法 与Page.ClientScript.RegisterClientScriptBlock() 方法
全栈程序员站长
2022/09/09
2.1K0
给自定义控件(Web Control)添加事件的几种方法。前两种方法可以不实现IPostBackEventHandler
    写自定义控件已经好久了,也有几个用得时间比较长的,但是对于“事件”一直是比较模糊,没有很详细的理解。     最近升级分页控件,由于原来使用的是VB.net(在VB.net里面添加一个事件是比较容易的),现在想改用C#,而原来的方法又写得比较笨拙,想换一个更简洁一点的方法,所以不得不重新认识一下事件。看了几遍《道不远人深入解析asp.net2.0控件开发》居然没有看懂,可能是自己太笨了吧。又找到了自定义分页控件开发 看了几遍,还是比较迷糊,最后把《自定义分页控件开发》 里提供的代码down下来看
用户1174620
2018/02/26
1.2K0
给自定义控件(Web Control)添加事件的几种方法。前两种方法可以不实现IPostBackEventHandler
用接口实现事件的一种方法,只是玩玩。
  前一阵子,firelong说,应该用接口实现事件,而不应该用委托。我就希望他能给出一个用接口实现事件的方法,我是一直等呀,等到了现在也没有看到。   昨天又看到了,Snake@Net  说不要把接口和委托给混淆了的文章。也许我就把他们给混淆了吧。他的文章没仔细看,不过我倒是突然想到了一个用接口实现事件的方法,写了一个简单的demo测试了一下,居然还成功了。   所以拿出来抖落抖落。   这个只是体现了一个简单的思路,我并不想用他来证明什么,只是写着玩的。 ========================
用户1174620
2018/02/26
6070
用接口实现事件的一种方法,只是玩玩。
ASP.Net请求处理机制初步探索之旅 - Part 4 WebForm页面生命周期
开篇:上一篇我们了解了所谓的请求处理管道,在众多的事件中微软开放了19个重要的事件给我们,我们可以注入一些自定义的业务逻辑实现应用的个性化设计。本篇,我们来看看WebForm模式下的页面生命周期。
Edison Zhou
2018/08/20
1.4K0
ASP.Net请求处理机制初步探索之旅 - Part 4  WebForm页面生命周期
ASP.NET 2.0页面框架的几处变化
本文由来源 21aspnet,由 javajgs_com 整理编辑,其版权均为 21aspnet 所有,文章内容系作者个人观点,不代表 Java架构师必看 对观点赞同或支持。如需转载,请注明文章来源。
Java架构师必看
2021/03/22
1.4K0
C#模拟POST表单提交 --- WebClient
WebClient:http://msdn.microsoft.com/zh-cn/library/system.net.webclient(v=VS.80).aspx(MSDN) 代码: string postString = "arg1=a&arg2=b";//这里即为传递的参数,可以用工具抓包分析,也可以自己分析,主要是form里面每一个name都要加进来 byte[] postData = Encoding.UTF8.GetBytes(postString);//编码,尤其是汉字,事先要看下抓取
磊哥
2018/05/08
1.9K0
我看AutoEventWireup
下面,着重说一下AutoEventWireup。大家可能不太注意这个,系统自动生成的一般我们情况下不用考虑,下面我们通过一个例子看一下这到底是什么?
全栈程序员站长
2022/09/01
7810
ASP.Net WebForm温故知新学习笔记:一、aspx与服务器控件探秘
开篇:毫无疑问,ASP.Net WebForm是微软推出的一个跨时代的Web开发模式,它将WinForm开发模式的快捷便利的优点移植到了Web开发上,我们只要学会三步:拖控件→设属性→绑事件,便可以行走于天下。但这样真的就可以走一辈子吗?实际上,ASP.Net经常被喷的诟病就在于WebForm以及只会拖控件的ASP.Net程序员,往往大型互联网系统也没有采用WebForm的模式进行开发。但是,WebForm并不是一无是处,而是我们没有用好,还有很多东西我们知其然不知其所以然,现在我们就来对这些平时所不注意但又十分关键的东西一探究竟。
Edison Zhou
2018/08/20
2.9K0
ASP.Net WebForm温故知新学习笔记:一、aspx与服务器控件探秘
C# .NET面试系列八:ADO.NET、XML、HTTP、AJAX、WebService(二)
如果你使用 JavaScript 的 fetch 函数发送 HTTP 请求,而观察到发送了两次请求,可能有几个常见的原因:
GoodTime
2024/03/11
3010
C# .NET面试系列八:ADO.NET、XML、HTTP、AJAX、WebService(二)
用Python模拟登录学校教务系统抢课
-- Illustrations by Vladislav Solovjov --
Python中文社区
2018/07/27
3.6K0
用Python模拟登录学校教务系统抢课
asp.net动态增加服务器端控件并提交表单
为什么要用原生的呢? 1、目的 原生出现浏览器兼容性问题 极少,不用测试多浏览兼容性 。需要考虑到市面上的其他垃圾浏览器。  2、性能不好 如果不考虑第一条 你可以换一种方式 直接上代码 .aspx页面 <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"
纯粹是糖
2018/03/14
1.5K0
asp.net动态增加服务器端控件并提交表单
Ajax之一 简介篇
Ajax基于那些已经广泛使用的浏览器技术,包括异步JavaScript和XML。Ajax这个概念出现后不久就开始风靡起来,因为它使Web应用程序的功能和用户界面(UI)变得更加接近于桌面应用程序。
用户9184480
2024/12/17
1090
Ajax之一 简介篇
ASP.NET验证控件学习总结与正则表达式学习入门
在做Web应用程序的时候,因为用户有可能输入各式各样的信息,经常需要大量的数据验证,如果交给服务器去验证的话,无疑会增加服务器的压力,而且也容易造成程序的异常。甚至导致网站出现一些安全问题。因此我们在将这些信息保存到网站的数据库之前,要对这些用户所输入的信息进行数据的合法性校验,以便后面的程序可以安全顺利的执行。
阳光岛主
2019/02/19
2.7K0
asp.net(c#)网页跳转几种方法小结「建议收藏」
在asp.net下,经常需要页面的跳转,下面是具体的几种方法。跳转页面是大部编辑语言中都会有的,正面我们来分别介绍一下关于.net中response.redirect sever.execute server.transfer 三种页面跳转的方法
全栈程序员站长
2022/09/09
2.4K0
C#学习笔记——回车Enter使输入焦点自动跳到下一个TextBox
在录入界面中,用户往往需要按回车键时光标自动跳入下一个文本框,以方便录入操作。在C#中实现该功能有多种方法,以下是小编收集的不使用TAB键,而直接用回车键将光标转到下一个文本框的实现方法。
vv彭
2021/09/07
6.6K0
表单脚本
刚开始人们使用JavaScript,最主要的目的之一就是表单的验证,分担服务器处理表单的责任。虽然现流行的大部分提交方式是通过ajax,但了解表单,对于ajax方式也是有重大帮助的!所以,大家不要看轻表单。
奋飛
2019/08/15
4.9K0
ASP.NET保持用户状态的九种选择
摘要:ASP.NET为保持用户请求之间的数据提供了多种不同的途径。你可以使用Application对象、cookie、hidden fields、Sessions或Cache对象,以及它们的大量的方法。决定什么时候使用它们有时很困难。本文将介绍了上述的技术,给出了什么时候使用它们的一些指导。尽管这些技术中有些在传统ASP中已经存在,但是有了.NET框架组件后该在什么时候使用它们发生了变化。为了在ASP.NET中保持数据,你需要调整从先前的ASP中处理状态中学习到的知识。
Java架构师必看
2021/03/22
1.9K0
推荐阅读
相关推荐
浅谈ASP.NET的Postback
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文