The ASP.Net relies on Single Form Interface (SFI) instead of Multi Form Interface (MFI), because SFI is a key element for the implementation of the ASP.NET state maintenance feature. Thus if you host two or more server side form then you will get run-time error 'A page can have only one server-side Form tag'. In ASP.NET, server-side forms are rendered using a class named HtmlForm. This class doesn't provide the familiar Action property, nor does it supply an alternative property.
When the render method is called, the page object processed and rendered the first server-side form and sets an internal flag to note that one form object has been processed for the page and for any subsequent inclusion of server-side form it throws an HttpException.
But you can include multiple HTML form without setting "runat =server" attribute in html form tag. The following codes demonstrate:
- How to include multiple form in your aspx page and to define another page URL.
- How to retrieve value of form controls in another aspx page.
[Main.aspx]: This is the main page which has two forms. The first form is server-side form which will post data to the same page. The second form is plain html-form without 'runat=server' attribute which will post data of its html controls to another aspx page. Html controls included inside this form are uniquely named.
<%@ Page language="c#" Codebehind="Main.aspx.cs" AutoEventWireup="false" Inherits="MultipleForm.Main" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
<HTML>
<HEAD>
<title>Main</title>
<meta content="Microsoft Visual Studio .NET 7.1" name="GENERATOR">
<meta content="C#" name="CODE_LANGUAGE">
<meta content="JavaScript" name="vs_defaultClientScript">
<meta content="http://schemas.microsoft.com/intellisense/ie5" name="vs_targetSchema">
<link type="text/css" href="MyStyle.css" rel="stylesheet">
</HEAD>
<body MS_POSITIONING="GridLayout">
<form id="frmMain" method="post" runat="server">
<table cellSpacing="0" cellPadding="0" width="95%" border="0">
<caption class="tblCaption">Post data to same page [ Main.aspx ]</caption>
<tr class="rowStyle">
<td width="25%">First Name</td>
<td width="25%"><input class="inputformat" type="text" id="txtFName" runat="server" NAME="txtFName"></td>
<td width="25%">Last Name</td>
<td width="25%"><input class="inputformat" type="text" id="txtLName" runat="server" NAME="txtLName"></td>
</tr>
<tr class="rowStyle">
<td></td>
<td colspan="2" align="center"><asp:Button CssClass="buttonStyle" id="btnSubmit" runat="server" Text="Post to Main"></asp:Button></td>
<td></td>
</tr>
</table>
</form>
<br>
<!------
The following form is design by using core ASP model which has
action attribute to define the url of the page where we want to
post/send data.
//---------->
<form action="A1.aspx" method="post">
<table cellSpacing="0" cellPadding="0" width="95%" border="0">
<caption class="tblCaption">Post data to another page [ A1.aspx ]</caption>
<tr class="rowStyle">
<td width="25%">First Name</td>
<!---
define name of the control so that you can access its
value by using its name in A1.aspx page
//--->
<td width="25%"><input class="inputformat" type="text" name="fname"></td>
<td width="25%">Last Name</td>
<td width="25%"><input class="inputformat" type="text" name="lname"></td>
</tr>
<tr class="rowStyle">
<td></td>
<td colspan="2" align="center"><input class="buttonStyle" type="submit" value="Post to A1"></td>
<td></td>
</tr>
</table>
</form>
</body>
</HTML>
[Main.aspx.cs]
using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
namespace MultipleForm
{
/// <summary>
/// Summary description for Main.
/// </summary>
public class Main : System.Web.UI.Page
{
protected System.Web.UI.WebControls.Button btnSubmit;
protected System.Web.UI.HtmlControls.HtmlInputText txtFName;
protected System.Web.UI.HtmlControls.HtmlInputText txtLName;
protected System.Web.UI.WebControls.TextBox txtfname;
private void Page_Load(object sender, System.EventArgs e)
{
// Put user code to initialize the page here
Response.Write("<font>First Name : " + txtFName.Value + "<br>");
Response.Write("Last Name : " + txtLName.Value + "</font><br>");
}
#region Web Form Designer generated code
override protected void OnInit(EventArgs e)
{
//
// CODEGEN: This call is required by the ASP.NET Web Form Designer.
//
InitializeComponent();
base.OnInit(e);
}
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.Load += new System.EventHandler(this.Page_Load);
}
#endregion
}
}
[A1.aspx.cs]
using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
using System.Collections.Specialized;
/* The System.Collections.Specialized namespace has
* NameValueCollection class which will be used to
* retrieve form fields data by defined name
*
*/
namespace MultipleForm
{
/// <summary>
/// Summary description for A1.
/// </summary>
public class A1 : System.Web.UI.Page
{
private void Page_Load(object sender, System.EventArgs e)
{
// Put user code to initialize the page here
Response.Write("<font>Data posted to A1.apsx page <br>");
// declare object of NameValueCollection class
NameValueCollection userdata;
// The form property of Request class returns a collection of form variables
// thus 'userdata' contains data in the form of Name-Value
userdata = Request.Form;
// now we can retrieve value of any form field by its name
Response.Write("First Name : " + userdata["fname"].ToString() + "<br>");
Response.Write("Last Name : " + userdata["lname"].ToString() + "</font><br>");
}
#region Web Form Designer generated code
override protected void OnInit(EventArgs e)
{
//
// CODEGEN: This call is required by the ASP.NET Web Form Designer.
//
InitializeComponent();
base.OnInit(e);
}
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.Load += new System.EventHandler(this.Page_Load);
}
#endregion
}
}
Reference: Cutting Edge: Form-based Programming in ASP.NET by Dino Esposito