none
关于用HttpWebRequest模拟aspx页面 RRS feed

  • 问题

  • 有个问题大家不知道有没有注意过,就是用HttpWebRequest模拟一个aspx页面回发,我们该怎么做才能触发页面上的button_click事件呢?生成一段viewstate吗?难就难再post回去的时候viewstate不知道该怎么处理。
    Promise you do it!
    2009年6月3日 1:54

答案

  • asp.net 事件的机制是通过隐藏域来实现的。在后台处理,找到匹配的事件、触发事件、执行处理方法。只是前台不同,后台事件处理机制和winform一样。
    你要实现这个过程需要把这个代码post给指定页面的url。
    <input type="hidden" name="__EVENTTARGET" id="__EVENTTARGET" value="" />
    <input type="hidden" name="__EVENTARGUMENT" id="__EVENTARGUMENT" value="" />
    <script type="text/javascript">
    <!--
    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>
    <a id="EventModule1_LinkButton1" href="javascript:__doPostBack('EventModule1$LinkButton1','')">LinkButton</a>
    

       eventTarget, eventArgument:哪个控件的哪个事件。就可以实现你要的功能~

     


    you have a dream,you gonna protect it! http://www.cnblogs.com/frank_xl
    2009年6月3日 3:27
    版主

全部回复

  • viewstate在页面html中
    http://feiyun0112.cnblogs.com/
    2009年6月3日 2:09
    版主
  • 你可以尝试下

    HttpWebRequest myHttpWebRequest = HttpWebRequest.Create("http://temp.org");
             myHttpWebRequest.Method = "POST";
             // Create a new string object to POST data to the Url.
             string inputData = Console.ReadLine();
             string viewState = "";//这里应该添加获取ViewState数据的方法,可以通过上一次获得的ResponseStream读取Html代码提取ViewState 如果是首次则为空 
    
             StringBuilder postData = new StringBuilder("_ViewState=");
             postData.Append(viewState);
             postData.Append("&Button1=Clicked"); ///还应该把表单数据这些也加进去
             ASCIIEncoding encoding = new ASCIIEncoding();
             byte[] byte1 = encoding.GetBytes(postData.ToString());
    
             myHttpWebRequest.ContentType = "application/x-www-form-urlencoded";
             myHttpWebRequest.ContentLength = byte1.Length;

     


    努力着就不会放弃!.net技术交流群 33083877http://hi.baidu.com/1987raymond
    2009年6月3日 2:10
    版主
  • 你要把叶面上所有的 form input 的值都post回去就好了

    viewstate 是一个form中的hidden input 
    紫柔版主的头像真叫萌得一个不行啊。。。。
    2009年6月3日 2:58
    版主
  • asp.net 事件的机制是通过隐藏域来实现的。在后台处理,找到匹配的事件、触发事件、执行处理方法。只是前台不同,后台事件处理机制和winform一样。
    你要实现这个过程需要把这个代码post给指定页面的url。
    <input type="hidden" name="__EVENTTARGET" id="__EVENTTARGET" value="" />
    <input type="hidden" name="__EVENTARGUMENT" id="__EVENTARGUMENT" value="" />
    <script type="text/javascript">
    <!--
    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>
    <a id="EventModule1_LinkButton1" href="javascript:__doPostBack('EventModule1$LinkButton1','')">LinkButton</a>
    

       eventTarget, eventArgument:哪个控件的哪个事件。就可以实现你要的功能~

     


    you have a dream,you gonna protect it! http://www.cnblogs.com/frank_xl
    2009年6月3日 3:27
    版主
  • 哈 斑竹一语惊醒梦中人。我怎么就这么笨呢,也就是说我们实现回发的脚本,最终就是设置eventTarget和eventArgument的隐藏域就可以了!
    Promise you do it!
    2009年6月3日 4:15
  • 哈 斑竹一语惊醒梦中人。我怎么就这么笨呢,也就是说我们实现回发的脚本,最终就是设置eventTarget和eventArgument的隐藏域就可以了!
    Promise you do it!

    晕~你说斑竹,我还不知道和说说话呢,后来发现你是在回我的留言。刚通过我的斑竹申请啊~呵呵。希望以后在和大家多交流~使论坛更精彩~~
    you have a dream,you gonna protect it! http://www.cnblogs.com/frank_xl
    2009年6月3日 4:42
    版主