这是我一年前写的一个用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来判断是哪个控件的什么事件触发了。

c#以POST方式模拟提交表单的更多相关文章

  1. jQuery 方式模拟提交表单

    //add test moudle define(function(require , exports , module) { //=========== 不使用模块化只使用如下代码即可 start ...

  2. .Net模拟提交表单

    2016-09-0210:49:20 以中邮速递API为服务接口,由于提交方式为表单提交,我要获取返回值来处理其他业务,所以一开始尝试采用Js后台获取返回值,但是涉及到跨域请求限制问题,那边服务端接口 ...

  3. C#.net模拟提交表单POST

    方法一.System.Net.WebClient WebClientObj        = new System.Net.WebClient();   System.Collections.Spec ...

  4. ASP.NET Core 1.0中实现文件上传的两种方式(提交表单和采用AJAX)

    Bipin Joshi (http://www.binaryintellect.net/articles/f1cee257-378a-42c1-9f2f-075a3aed1d98.aspx) Uplo ...

  5. php 使用curl 进行简单模拟提交表单

    //初始化curl $ch = curl_init(); $url = 'xxx'; $option = [ CURLOPT_URL => $url, CURLOPT_HEADER => ...

  6. java模拟表单上传文件,java通过模拟post方式提交表单实现图片上传功能实例

    java模拟表单上传文件,java通过模拟post方式提交表单实现图片上传功能实例HttpClient 测试类,提供get post方法实例 package com.zdz.httpclient; i ...

  7. C#的提交表单方式主要有两种WebClient与HttpWebRequest

    根据黄聪:C#模拟网站页面POST数据提交表单(转) using System; using System.Collections.Generic; using System.IO; using Sy ...

  8. js模拟form表单提交数据, js模拟a标签点击跳转,避开使用window.open引起来的浏览器阻止问题

    js模拟form表单提交数据, js模拟a标签点击跳转,避开使用window.open引起来的浏览器阻止问题 js模拟form表单提交数据源码: /** * js模拟form表单提交 * @param ...

  9. Linux curl 模拟form表单提交信息和文件

    Linux curl 模拟form表单提交信息和文件   curl是一个命令行方式下传输数据的开源传输工具,支持多种协议:FTP.HTTP.HTTPS.IMAP.POP3.TELNET等,功能超级强大 ...

随机推荐

  1. BZOJ.3257.树的难题(树形DP)

    题目链接 状态只与黑.白两点的颜色有关,于是用 \(f[x][i][j]\)表示当前以x为根节点,有\(i\)个黑点\(j\)个白点,使得x子树满足该条件的最小花费. 最后答案就是 \(min\{f[ ...

  2. 如何处理C++构造函数中的错误——兼谈不同语言的错误处理

    用C++写代码的时候总是避免不了处理错误,一般来说有两种方式,通过函数的返回值或者抛出异常.C语言的错误处理一律是通过函数的返回值来判断的,一般是返回0.NULL或者-1表示错误,或者直接返回错误代码 ...

  3. 【Codeforces666E】Forensic Examination 后缀自动机 + 线段树合并

    E. Forensic Examination time limit per test:6 seconds memory limit per test:768 megabytes input:stan ...

  4. 【Tsinsen-A1486】树(王康宁) 点分治 + Trie

    A1486. 树(王康宁) 时间限制:1.0s   内存限制:512.0MB   总提交次数:455   AC次数:97   平均分:52.62 查看未格式化的试题   提交   试题讨论 试题来源 ...

  5. 简单单层bp神经网络

    单层bp神经网络是解决线性可回归问题的. 该代码是论文:https://medium.com/technology-invention-and-more/how-to-build-a-simple-n ...

  6. UVALive 6911 Double Swords 树状数组

    Double Swords 题目连接: https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8 ...

  7. UVALive 6908 Electric Bike dp

    Electric Bike 题目连接: https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8 ...

  8. Windows系列之(一):Windows10 上运行Ubuntu Bash

    1. 前言 2016年4月6日,Windows 10 Insider Preview 发布的版本 14316,添加了Ubuntu Bash,在Windows上提供一个Linux环境,可以直接执行Lin ...

  9. 7款精美HTML5应用

    1,HTML5/jQuery雷达动画图表图表配置十分简单 分享一款很特别的HTML5图表,它是利用HTML5和jQuery的雷达动画图表,图表数据在初始化的时候带有一定动画. 在线演示         ...

  10. 使用CefSharp在.Net程序中嵌入Chrome浏览器(八)——Cookie

    CEF中的Cookie是通过CookieManager来管理的,可以用它来设置发送的Cookie. 发送Cookie 发送Cookie的一个基本示例如下: var cookieManager = _c ...