【发布时间】:2009-11-02 20:02:40
【问题描述】:
在每个页面上(坐在主页面上)我都有登录字段。
在其他页面中,我有不同的控件,例如联系公式。
如何为此设置多个<form>-tag?
【问题讨论】:
标签: asp.net
在每个页面上(坐在主页面上)我都有登录字段。
在其他页面中,我有不同的控件,例如联系公式。
如何为此设置多个<form>-tag?
【问题讨论】:
标签: asp.net
ASP.NET Web 窗体仅围绕 1-form 概念构建。要解决此问题,您需要使用不同的风格(如 MVC)或查看本文以了解如何在 Web 表单中解决此问题:
【讨论】:
不幸的是,对于 ASPNET 表单,您只能拥有一个带有 runat="server" 属性的 FORM 标记。
但是,如果您排除 runat="server" 属性,您可以拥有任意数量的 FORM 标签(只要它们不相互嵌套)。
例如,在您的母版页上,您可以在页面顶部有一个登录表单,然后在表单中包含runat="server" 稍低一些:
<form action="login" method="post">
<input type="text" name="username" />
<input type="password" name="password" />
<input type="submit" value="Login" />
</form>
<form runat="server">
... place server controls here ...
</form>
【讨论】:
有一种方法可以通过使用自定义 HtmlForm 类来切换表单,该类可以打开和关闭表单标记呈现。我发表了一篇关于如何将其用于 PayPal 并解决 ASP.NET 单一表单标签问题的博文:
http://www.codersbarn.com/post/2008/03/08/Solution-to-ASPNET-Form-PayPal-Problem.aspx
希望这会有所帮助:-)
【讨论】:
它不能用 Asp.net web 表单完成(你可以有很多表单,但只有一个应该有一个 runat="server" 这不是实用的)但是你可以用 Asp.net MVC 轻松完成它
【讨论】:
您可以使用验证组将表单拆分为多个逻辑表单,以便您可以在按钮的 Click 事件处理程序中调用验证。这实际上是您在 ASP.Net 中需要多个表单的全部内容,除非您试图避免在回发时将所有表单字段中的数据发回。
尝试以下页面示例:
<%@ Page Language="C#" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<script runat="server">
protected void btnSendMessage_Click(object sender, EventArgs e)
{
Page.Validate("contact");
if (!Page.IsValid)
return;
}
protected void btnLogin_Click(object sender, EventArgs e)
{
Page.Validate("login");
if (!Page.IsValid)
return;
}
</script>
<table>
<tr>
<td>
<asp:Label ID="lblUsername" AssociatedControlID="txtName" runat="server">Username:</asp:Label>
</td>
<td>
<asp:TextBox ID="txtName" ValidationGroup="login" runat="server" />
<asp:RequiredFieldValidator ID="reqName" ControlToValidate="txtName" Display="Dynamic" ErrorMessage="You must supply a username"
ValidationGroup="login" runat="server" />
</td>
</tr>
<tr>
<td>
<asp:Label ID="lblPassword" AssociatedControlID="txtPassword" runat="server">Password:</asp:Label>
</td>
<td>
<asp:TextBox ID="txtPassword" ValidationGroup="login" runat="server" />
<asp:RequiredFieldValidator ID="reqPassword" ControlToValidate="txtPassword" Display="Dynamic" ErrorMessage="You must supply a password"
ValidationGroup="login" runat="server" />
</td>
</tr>
<tr>
<td colspan="2">
<asp:Button ID="btnLogin" Text="Login" ValidationGroup="login" OnClick="btnLogin_Click" runat="server" />
</td>
</tr>
</table>
<hr />
<h1>Contact</h1>
<table>
<tr>
<td>
<asp:Label ID="lblYourName" AssociatedControlID="txtYourName" runat="server">Your name:</asp:Label>
</td>
<td>
<asp:TextBox ID="txtYourName" runat="server" ValidationGroup="contact" />
<asp:RequiredFieldValidator ID="reqYourName" ControlToValidate="txtYourName" Display="Dynamic" ErrorMessage="Tell us your name!"
ValidationGroup="contact" runat="server" />
</td>
</tr>
<tr>
<td>
<asp:Label ID="lblYourEmail" AssociatedControlID="txtYourEmail" runat="server">Your email:</asp:Label>
</td>
<td>
<asp:TextBox ID="txtYourEmail" runat="server" ValidationGroup="contact" />
<asp:RequiredFieldValidator ID="reqEmail" ControlToValidate="txtYourEmail" Display="Dynamic" ErrorMessage="Tell us your email!"
ValidationGroup="contact" runat="server" />
</td>
</tr>
<tr>
<td>
<asp:Label ID="lblMessage" AssociatedControlID="txtMessage" runat="server">Your message:</asp:Label>
</td>
<td>
<asp:TextBox ID="txtMessage" TextMode="MultiLine" runat="server" ValidationGroup="contact" />
<asp:RequiredFieldValidator ID="reqMessage" ControlToValidate="txtMessage" Display="Dynamic" ErrorMessage="We need you to send us a message!"
ValidationGroup="contact" runat="server" />
</td>
</tr>
<tr>
<td colspan="2">
<asp:Button ID="btnSendMessage" ValidationGroup="contact" Text="Contact" OnClick="btnSendMessage_Click" runat="server" />
</td>
</tr>
</table>
</form>
</body>
</html>
在这里你得到验证,它表现为两个单独的表单,尽管来自两个“表单”的数据将被发回。
这是在一个页面上具有多个操作的标准范例,并且自 ASP.Net 2 以来就一直存在:)。
请原谅使用内联代码,我认为这会使示例更易于理解。
【讨论】: