到目前为止,我遇到的所有网页最多只包含一个<form>
标记。为什么不多个?我想不出为什么多个表单不能在同一个网页中共存的原因。
另外,要特定于ASP.NET - 为什么所有服务器控件都放在<form>
标记内?为什么不把它们放在别的地方呢?
另外,
我注意到在.aspx
文件中,<form>
标记具有 runat = server 属性,而普通服务器控件(如Button
)也有一。因此<form>
似乎也是服务器控件。但奇怪的是,我在Visual Studio工具箱中找不到它。
答案 0 :(得分:24)
确实是WebForms的shortcoming。在ASP.NET MVC中,您可以根据需要实现任意数量的表单(并且它是有效且正确的网页行为)。
所有服务器控件放在<form>
标记内的原因是允许WebForms引擎识别它们,加载它们的值和放大器。将它们的值保存到ViewState。 WebForms中几乎所有控制管理基础结构都基于标记包含您从代码隐藏中访问的所有内容的想法。
答案 1 :(得分:3)
正如所指出的,这是WebForms的缺点之一。我还想指出,对于cross-page posting和validation groups,您通常可以达到所需的行为(对于大多数“多表单”解决方案)。
答案 2 :(得分:2)
关于其他问题:<form runat="server">
在幕后被解析为HtmlForm
类,其继承自HtmlControl
,与runat="server"
的任何其他HTML元素一样。
与其他任何HtmlControl不同,每页只能存在一个实例,它不会出现在工具箱中,因为它会自动添加到您创建的每个新表单中,因此它毫无意义。
答案 3 :(得分:0)
是的,可以通过创建自定义HtmlForm对象并根据需要切换表单来完成。我刚刚在这里回答了一个类似的问题(带代码):
Paypal Form Ruins My ASP.NET webforms layout -> How to Solve?
答案 4 :(得分:0)
许多非服务器表单 - 您可以,但只有一个runAt Server表单
我也发现了这个:
服务器端表单标记是具有runat =“server”属性的标记。如果这个属性 缺少,那么它是一个典型的HTML表单标签。结论是你被允许使用 页面上有多个表单标记,只要只有一个具有runat =“server”属性。该 不具有此属性的表单的缺点是视图状态将不起作用 (意味着使用后退/前进浏览器按钮时表单值将消失)。它是 如果您真的需要在页面上使用多个表单,那么需要付出很小的代价。
答案 5 :(得分:-5)
这是两种形式
的正确方法