如何将表单从HTML页面发布到ASPX页面(2.0)并能够读取值?
我目前有一个使用成员资格提供程序的ASP.NET站点,一切正常。用户可以从Login.aspx页面登录。
我们现在希望能够让用户直接从其他网站登录 - 这基本上是一个静态HTML页面。用户需要能够在此HTML页面上输入他们的名称和密码,并将其POST到我的Login.aspx页面(我可以手动登录)。
是否可以将表单值从HTML传递到ASPX?我已经尝试了一切,Request.Form.Keys集合总是空的。我不能使用HTTP GET,因为它们是凭据,不能在查询字符串上传递。
我所知道的唯一方法是iframe。
答案 0 :(得分:28)
非常可能。我嘲笑了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),因为某些东西可能不会出现在您期望的位置。
答案 1 :(得分:19)
如果您的html输入都没有NAME,则Request.Form.Keys集合将为空。在你做了一段时间的.NET之后,很容易忘记将它们放在那里。只需命名它们就可以了。
答案 2 :(得分:2)
您确定您的HTML表单是否正确,并且实际上是否进行了HTTP POST?我建议运行Fiddler2,然后尝试通过您的Login.aspx,然后远程HTML站点登录,然后比较发送到服务器的请求。对我来说,ASP.Net总是工作正常 - 如果HTTP请求包含有效的POST,我可以使用Request.Form获取值......
答案 3 :(得分:1)
你确定可以。
查看如何执行此操作的最简单方法是浏览到要发布到的aspx页面。然后将该页面的源保存为HTML。更改新html页面上表单的操作,以指回最初复制它的aspx页面。
在表单字段中添加值标记,并将所需数据放在那里,然后打开页面并点击提交按钮。
答案 4 :(得分:1)
你确定可以。创建一个HTML页面,其中包含login.aspx页面中的必要组件(即用户名等),并确保它们具有相同的ID。为了你的行动,请确保它是一个帖子。
您可能必须在Page_Load函数的login.aspx页面上执行一些代码来读取表单(在Request.Form对象中)并调用相应的函数来记录用户,但除此之外,您应该可以访问表单,并可以用它做你想做的事。
答案 5 :(得分:1)
在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"
以防止空视图状态的验证错误。
Code Behind / Inherits值不准确。
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));
}
}
答案 6 :(得分:0)
希望这会有所帮助 - 把这个标签放在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"];
}
}
答案 7 :(得分:0)
删除数据发布/发布的.aspx页的runat =“ server”部分。
答案 8 :(得分:-1)
我在 https://www.mikesdotnetting.com/article/293/request-form-is-empty-when-posting-to-aspx-page 中找到了一个可行的解决方案。关键是,从 action 属性中删除 .aspx。
前:<FORM NAME="Logon" action="default" method="post">