在每个页面上(坐在主页面上)我都有登录字段。
在其他页面中,我有不同的控件,例如联系方式。
如何为此设置多个<form>
- 标记?
答案 0 :(得分:5)
ASP.NET Web窗体仅围绕1-form的概念构建。要解决这个问题,你需要使用不同的风格(一个MVC)或者看看这篇文章如何在Web窗体中解决它:
答案 1 :(得分:3)
不幸的是,使用ASPNET表单时,您只能拥有一个带有FORM
属性的runat="server"
代码。
但是,如果排除FORM
属性(并且只要它们没有嵌套在另一个内),您就可以拥有任意数量的runat="server"
个标记。
例如,在您的母版页上,您可以在页面顶部有一个登录表单,然后将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>
答案 2 :(得分:1)
无法使用Asp.net网页表单(你可以有多种表单,但只有一个应该有一个runat =“server”,这不是很简单)但是你可以用Asp.net MVC轻松完成它
答案 3 :(得分:1)
有一种方法可以使用自定义HtmlForm类来切换表单,该类可以打开和关闭表单标记呈现。我发布了一篇博客文章,介绍如何将其用于PayPal并解决ASP.NET单一表单标记问题:
http://www.codersbarn.com/post/2008/03/08/Solution-to-ASPNET-Form-PayPal-Problem.aspx
希望这会有所帮助: - )
答案 4 :(得分:1)
您可以使用验证组将表单拆分为多个逻辑表单,以便可以在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以来一直存在。)。
请原谅使用内联代码,我认为这样可以使示例更容易理解。