【问题标题】:How to POST a FORM from HTML to ASPX page如何将表单从 HTML 发布到 ASPX 页面
【发布时间】:2010-09-17 13:57:23
【问题描述】:

如何将表单从 HTML 页面发布到 ASPX 页面 (2.0) 并能够读取值?

我目前有一个使用 Membership 提供程序的 ASP.NET 站点,并且一切正常。用户可以从 Login.aspx 页面登录。

我们现在希望能够让用户直接从另一个网站登录——这基本上是一个静态 HTML 页面。用户需要能够在此 HTML 页面上输入他们的姓名和密码,并将其发布到我的 Login.aspx 页面(然后我可以手动登录)。

是否可以将表单值从 HTML 传递到 ASPX?我什么都试过了,Request.Form.Keys 集合总是空的。我不能使用 HTTP GET,因为这些是凭据,不能通过查询字符串传递。

我知道的唯一方法是 iframe。

【问题讨论】:

标签: asp.net


【解决方案1】:

这是非常可能的。我模拟了 3 页应该给你一个概念证明:

.aspx 页面:

<form id="form1" runat="server">
    <div>
        <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
        <asp:TextBox TextMode="password" ID="TextBox2" runat="server"></asp:TextBox>
        <asp:Button ID="Button1" runat="server" Text="Button" />
    </div>
</form>

后面的代码:

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    For Each s As String In Request.Form.AllKeys
        Response.Write(s & ": " & Request.Form(s) & "<br />")
    Next
End Sub

单独的 HTML 页面:

<form action="http://localhost/MyTestApp/Default.aspx" method="post">
    <input name="TextBox1" type="text" value="" id="TextBox1" />
    <input name="TextBox2" type="password" id="TextBox2" />
    <input type="submit" name="Button1" value="Button" id="Button1" />
</form>

...它会按预期反刍表单值。如果这不起作用,如其他人建议的那样,请使用流量分析工具(fiddler,ethereal),因为某些事情可能没有按照您的预期进行。

【讨论】:

  • 这在 ASP.NET 4 中对我不起作用,从搜索看来这可能与 Viewstate 有关。我已经尝试禁用此功能,但目前还没有任何运气,登录仍然没有发生。
【解决方案2】:

如果您的 html 输入都没有名称,则 Request.Form.Keys 集合将为空。在您使用 .NET 一段时间后,很容易忘记将它们放在那里。只需命名它们,您就可以开始使用了。

【讨论】:

  • 我花了很长时间才意识到这一点。当您在.Net 中执行此操作时,asp.net 引擎会自动添加名称属性。如果您“手动”创建 html 表单,很容易忘记它,然后什么都没有发布,您想知道为什么。
  • 是的,我正在设置 ID,但忘记设置名称:S
【解决方案3】:

您确定您的 HTML 表单是正确的,并且确实执行了 HTTP POST 吗?我建议运行Fiddler2,然后尝试通过您的 Login.aspx 登录,然后是远程 HTML 站点,然后比较发送到服务器的请求。对我来说,ASP.Net 一直运行良好——如果 HTTP 请求包含有效的 POST,我可以使用 Request.Form 获取值...

【讨论】:

    【解决方案4】:

    你当然可以。

    了解如何执行此操作的最简单方法是浏览到要发布到的 aspx 页面。然后将该页面的源代码保存为 HTML。将表单在新 html 页面上的操作更改为指向您最初从中复制它的 aspx 页面。

    将值标签添加到您的表单字段并将您想要的数据放入其中,然后打开页面并点击提交按钮。

    【讨论】:

      【解决方案5】:

      你当然可以。创建一个 HTML 页面,其中包含来自 login.aspx 页面的必要组件(即用户名等),并确保它们具有相同的 ID。对于您的操作,请确保它是一个帖子。

      您可能必须在 Page_Load 函数中的 login.aspx 页面上执行一些代码来读取表单(在 Request.Form 对象中)并调用适当的函数来登录用户,但除此之外,您应该可以访问表单,并且可以用它做任何你想做的事情。

      【讨论】:

        【解决方案6】:

        在 html 表单中,您需要提供额外的 viewstate 变量并在服务器页面中禁用 ViewState。 不过,这需要双方都进行一些控制。

        表单 HTML:

        <html><body> <form id='postForm' action='WebForm.aspx' method='POST'>
                <input type='text' name='postData' value='base-64-encoded-value' />
                <input type='hidden' name='__VIEWSTATE' value='' />  <!-- still need __VIEWSTATE, even empty one -->
            </form>
        
        </body></html>
        

        注意空__VIEWSTATE。

        WebForm.aspx:

        <%@ Page Language="C#" AutoEventWireup="true" 
        CodeBehind="WebForm.aspx.cs" Inherits="WebForm"
         EnableEventValidation="False" EnableViewState="false" %>
        
        <!DOCTYPE html>
        
        <html xmlns="http://www.w3.org/1999/xhtml">
        <head runat="server">
            <title></title>
        </head>
        <body>
            <form id="postForm" runat="server">
                <asp:TextBox ID="postData" runat="server"></asp:TextBox>
            <div>
        
            </div>
            </form>
        </body>
        </html>
        

        注意EnableEventValidation="False", EnableViewState="false" 以防止空视图状态的验证错误。 代码隐藏/继承值不精确。

        WebForm.cs:

        public partial class WebForm : System.Web.UI.Page
        {
            protected void Page_Load(object sender, EventArgs e)
            {
                string value = Encoding.Unicode.GetString(Convert.FromBase64String(this.postData.Text));
            }
        }
        

        【讨论】:

          【解决方案7】:

          希望这会有所帮助 - 将此标签放在 html 中,然后

          删除你的 login.aspx 设计内容..只写页面指令

          单击提交按钮后,您将在 aspx 页面中获取值 像这样- protected void Page_Load(object sender, EventArgs e) {

                  if (!IsPostBack)
                  {
                      CompleteRegistration();
                  }
              }
          

          public void CompleteRegistration() {

                  NameValueCollection nv = Request.Form;
                  if (nv.Count != 0)
                  {
                      string strname = nv["txtbox1"];
                      string strPwd = nv["txtbox2"];
                  }
              }
          

          【讨论】:

            【解决方案8】:

            删除数据发布/发布的 .aspx 页面的 runat="server" 部分。

            【讨论】:

              【解决方案9】:

              我在https://www.mikesdotnetting.com/article/293/request-form-is-empty-when-posting-to-aspx-page 中找到了一个可行的解决方案。关键是,从 action 属性中删除 .aspx。

              例如:&lt;FORM NAME="Logon" action="default" method="post"&gt;

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2019-01-22
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多