在 ASP.NET 中使用嵌入式标准 HTML 表单
Posted
技术标签:
【中文标题】在 ASP.NET 中使用嵌入式标准 HTML 表单【英文标题】:Using embedded standard HTML forms with ASP.NET 【发布时间】:2010-10-09 23:50:11 【问题描述】:我有一个标准的 aspx 页面,我需要在其中添加另一个标准 html 表单并将其提交到另一个位置(外部站点),但是每当我按下提交按钮时,页面似乎会回发而不是使用子表单操作 url。
以下形式关系的模型。请注意,在实际部署中,表单将成为母版页布局的内容区域的一部分,因此表单需要独立于母版页表单提交。
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>Untitled Page</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<form id="subscribe_form" method="post" action="https://someothersite.com" name="em_subscribe_form" >
<input type="text" id="field1" name="field1" />
<input id="submitsubform" type="submit" value="Submit" />
</form>
</div>
</form>
</body>
</html>
【问题讨论】:
【参考方案1】:对于这个问题有一个非常好的棘手的解决方案。
您可以在<form>
之前插入</form>
标记以关闭导致问题的asp.net 表单。不要忘记在您的 html 表单后添加 <form>
标签。它可能会导致编辑器给你一个异常,但不用担心,它会起作用的。
【讨论】:
在 iE8 中打破布局的好工作 在 IE9 中也破坏了布局,这不是一个好的通用解决方案。【参考方案2】:根据我的经验,Appetere Web Solutions 拥有最好的解决方案。简单而优雅......而且它不是黑客。使用 PostBackUrl。
我刚刚试了一下,一切正常。我不想使用 javascript,因为我不想在每个使用它的页面的母版页中都包含它。
【讨论】:
【参考方案3】:如果您将 ASP.NET 按钮添加到表单,并将其 PostBackUrl 属性设置为外部站点,则所有表单数据都将发布到该 URL。
【讨论】:
做到了。我使用这种技术从 DNN HTML 模块发布表单。 对我来说,这是迄今为止最简单、最整洁的解决方案。 太棒了!这不会破坏我能说的任何东西。干得好!【参考方案4】:我的情况和罗斯一样——除了我的输入类型都是“隐藏”的类型。
Cowgod 的回答让我想到了我的 .aspx 页面中的嵌套表单。我最终从主 .aspx 表单 ( ) 中“取消嵌套”了我的第二个表单,并将它(连同我的 js 脚本标签)放在 body 标签下方 - 但在主 .aspx 表单标签之前。
突然间,一切都按预期提交了。这是黑客吗?
【讨论】:
【参考方案5】:这是一个有趣的问题。理想情况下,您只需要其他用户提到的页面上的 1 个表单标签。您可能可以通过 javascript 发布数据而无需 2 个表单标签。
示例取自here,根据您的需要进行了修改。不能 100% 确定这是否适合您,但我认为您必须这样做。
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>Untitled Page</title>
<script type="text/javascript">
function postdata()
var fieldValue = document.getElementById("field1").value;
postwith("http://someothersite.com",field1:fieldValue);
function postwith (to,p)
var myForm = document.createElement("form");
myForm.method="post" ;
myForm.action = to ;
for (var k in p)
var myInput = document.createElement("input") ;
myInput.setAttribute("name", k) ;
myInput.setAttribute("value", p[k]);
myForm.appendChild(myInput) ;
document.body.appendChild(myForm) ;
myForm.submit() ;
document.body.removeChild(myForm) ;
</script>
</head>
<body>
<form id="form1" runat="server">
<div>
<div>
<input type="text" id="field1" name="field1" />
<asp:Button ID="btnSubmitSubscribe" runat="server" Text="Submit" OnClientClick="postdata(); return false;" />
</div>
</div>
</form>
</body>
</html>
如果 javascript 不是一个可行的选项 - 您可以使用 .Net 的 HttpWebRequest 对象在后面的代码中创建 post 调用。在后面的代码中看起来像这样(假设您的文本字段是一个 asp 文本框:
private void OnSubscribeClick(object sender, System.EventArgs e)
string field1 = Field1.Text;
ASCIIEncoding encoding=new ASCIIEncoding();
string postData="field1="+field1 ;
byte[] data = encoding.GetBytes(postData);
// Prepare web request...
HttpWebRequest myRequest =
(HttpWebRequest)WebRequest.Create("http://someotherwebsite/");
myRequest.Method = "POST";
myRequest.ContentType="application/x-www-form-urlencoded";
myRequest.ContentLength = data.Length;
Stream newStream=myRequest.GetRequestStream();
// Send the data.
newStream.Write(data,0,data.Length);
newStream.Close();
【讨论】:
还添加了一个无 javascript 方法 啊,很好。我知道有一种方法可以从代码隐藏中做到这一点。谢谢。 效果很好。谢谢! @brendan 如果用户使用 Enter 键提交表单,这是否有效?【参考方案6】:嵌套表单在 HTML according to the W3C 中是不可能的。您可以使用 JavaScript 或 with jQuery 来实现您的预期结果,正如 Peter 在名为 My Thoughts 的博客中所解释的那样。
【讨论】:
【参考方案7】:ASP.NET 允许您在一页上有多个表单,但只有一个可以是runat=server
。但是我认为你根本不能嵌套表单。
您可能必须创建一个新的母版页,一个没有表单标签的母版页,因此该表单只能在该页上工作。这不是一个好的解决方案,除非您可以将表单放在母版页的表单之外,并使用 javascript 提交第二个表单,但这也好不到哪里去。对于您要实现的目标,确实没有好的解决方案,如果是这样,我想听听。我认为您不能从代码隐藏中进行 POST 调用,可以吗?我敢肯定有什么办法。但这可能是唯一的解决方案:来自代码。
【讨论】:
以上是关于在 ASP.NET 中使用嵌入式标准 HTML 表单的主要内容,如果未能解决你的问题,请参考以下文章
什么时候应该使用标准的 html 标签/输入,什么时候应该使用 asp.net 控件?
Microsoft OCS 是不是可以嵌入到 asp.net 网页中。需要多长时间?
怎样将EXCEL嵌入ASP.net网页中,象ASP下的VBA一样的效果,并将数据库的数据读取到EXCEL中?