我有一个弹出窗口(用户控件),我想在其上添加提交时的视图状态。我为用户控件启用了视图状态,但是viewstate仍未附加我的提交请求。
我观察到在form标签内没有弹出窗口。我找不到任何解决方案将其带入form标记,因为form标记属于父控件,并且具有打开该弹出窗口的链接
提交请求看起来像: 表格数据: 日期:29/04/2019 电子邮件:abcd@jmail.com.com personalMessage:提醒我的课程
在其他页面中,表单数据以
的形式出现表格数据: 日期:29/04/2019 名:测试名 电话号码:582374674 VIEWSTATE:asdfgfsf63564645 ..
答案 0 :(得分:1)
简短的版本是您没有看到任何视图状态,因为正如您所说的,弹出窗口不在form标签之内。
ASP.NET Web表单的工作原理是使用具有runat=server
属性的表单,如下所示:
<form runat="server">
将页面呈现为HTML时,它将在该服务器表单内生成一个名为__VIEWSTATE
的隐藏表单元素,
<form runat="server">
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="ivjHtVx...wUmW4=" />
...other controls...
</form>
其中包含有关页面状态及其控件的信息。如果有任何原因导致该表单被发回,则表单数据将包含该viewstate。 ASP.NET通过将信息存储在页面上并让客户端再次将其发送回去,来“记住”信息是一种技巧。
例如,假设您有一个像这样的控件:
<asp:Label runat="server" Visible="True">Hello world!!</asp:Label>
...并且即使您设置了Visible = false
,也会响应其他页面。 ASP.NET将数据存储在viewstate中以告知其标签现在已隐藏。否则,下一次用户发布到页面上时,它不会知道该标签应该被隐藏。
每页只能有一个<form runat="server">
表单。您可以添加其他表单,但是隐藏的viewstate输入不在这些表单中。只有服务器形式。因此,如果您有单独的表单并提交,则提交的表单数据将不包含viewstate。 ASP.NET不会记住有关您更改的其他控件的状态的任何信息,包括将数据绑定到控件之类的事情。全部都消失了。
这就是为什么当您提交其他表单时会看到一组不同的表单字段,并且没有viewstate的原因。
这意味着,如果您想要页面上其他行为类似于单独形式的页面,这将更加困难。您可以使用单独的客户端代码来模拟发布表单。您可以将其他表单创建为单独的页面,并在其他页面中将其显示为iframe。这样,它就可以作为一个单独的页面,具有自己的服务器形式和自己的viewstate。这也可能变得复杂。
或者您可以尝试找到一种将所有这些内容合并到您已经拥有的一个服务器端表单中的方法。
这不是很漂亮,但希望它至少可以解释为什么您看不到其他表单的视图状态。