我维护的其中一个网站在很大程度上依赖于使用ViewState(它不是我的代码).但是,在某些ViewState特别容易发生爆炸的页面上,Safari会抛出"Validation of viewstate MAC failed"错误.
这似乎只发生在Safari中.Firefox,IE和Opera都在同一场景中成功加载.
除了因为会话存储是多个页面的会话全局,你为什么要使用viewstate来保存值?
从客户端到服务器之间来回发送除了一些小的查询字符串之外的任何类型的信息似乎有点荒谬.我的意思是浪费带宽(!),仅用于存储目的.该会话虽然跨越多个页面,但看起来像是一个完全优于视图状态的替代方案.
特别是对于asp.net ajax控件和变体,viewstate可能很快变得臃肿,跟踪所有这些不同控件和html元素的各种状态和变量.
但那么为什么页面变量和对象的视图存储呢?
也许我错过了该页面的viewstate存储的另一个很好的用法,有没有人知道那里的东西?
谢谢阅读!
编辑:每个人都有一个很好的答案,对不起,如果我没有选择你的.
我很抱歉可能会提出这样一个基本问题,但在ASP.NET网站上__VIEWSTATE输入字段代表什么?
另外,有没有办法计算它的值(基于其他表单字段的值)?
我理解__VIEWSTATE,顾名思义,维护网页中表单字段值的值,但我感兴趣的是如何生成这种状态(字符串).如果我base64_decode任何__VIEWSTATE字符串,我看到的是一堆神秘的HTML.
有没有办法更好地了解究竟是什么编码?我已经搜索了过去的问题,我发现了一些可以像这样做的工具,但不幸的是它似乎没有用.
我问这个的原因是因为我访问了一个Web服务API,它为我提供了我需要使用的大部分值.但是,我还需要一个仅在表单的最后一个阶段可用的附加字段.我已经联系了网络服务提供商但不幸的是他们不会很快更新他们的API.我希望我可以使用Web服务数据预填充表单初始值,然后计算__VIEWSTATE以访问在表单的最后一个阶段显示的最后一个字段,这将使整个过程更快.
不确定我是否让自己清楚了......
我试图在客户端访问视图状态但是在出现异常后:

JAVASCRIPT:
<script language="javascript" type="text/javascript">
var vCode = '<%=ViewState("code")%>';
alert(dateView);
</script>
Run Code Online (Sandbox Code Playgroud)
代码背后:
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
ViewState("code") = "EE"
End Sub
Run Code Online (Sandbox Code Playgroud)
有谁建议我怎么做?
动态控制问题
大家好,
我想创建一些动态控件,并让它们在页面加载中保持其viewstate.够容易吧?我所要做的就是在每次加载页面时使用相同的ID重新创建控件.但是,这是捕获 - 在我的PreRender事件中,我想要清除控件集合,然后使用新值重新创建动态控件.造成这种情况的原因很复杂,我可能需要大约一页来解释我为什么要这样做.所以,为了简洁起见,让我们假设我绝对必须这样做,而且别无他法.
在我的PreRender事件中重新创建控件后,问题出现了.重新创建的控件永远不会绑定到视图状态,并且它们的值不会跨页面加载持续存在.我不明白为什么会这样.我已经在我的OnLoad事件中重新创建了控件.当我这样做时,新创建的控件绑定到ViewState就好了,前提是我每次都使用相同的ID.但是,当我尝试在PreRender事件中执行相同的操作时,它会失败.
无论如何,这是我的示例代码:
namespace TestFramework.WebControls {
public class ValueLinkButton : LinkButton
{
public string Value
{
get
{
return (string)ViewState[ID + "vlbValue"];
}
set
{
ViewState[ID + "vlbValue"] = value;
}
}
}
public class TestControl : WebControl
{
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
Controls.Clear();
ValueLinkButton tempLink = null;
tempLink = new ValueLinkButton();
tempLink.ID = "valueLinkButton";
tempLink.Click += new EventHandler(Value_Click);
if (!Page.IsPostBack)
{
tempLink.Value = "old value";
}
Controls.Add(tempLink);
}
protected override void OnPreRender(EventArgs …Run Code Online (Sandbox Code Playgroud) Webforms中的ViewState和MVC中的ViewBag之间是否存在功能差异?它们似乎是"同一件事".并且可以以相同的方式使用.我问,因为MVC推广无状态Web而不是填充页面中的数据导致膨胀和性能降低.但似乎你也可以在MVC中做到这一点.他们所做的一切,似乎只是给它一个新名字.
当我为页面禁用ViewState时.它不允许任何其他控件使用ViewState ..即使我为该特定控件设置EnableViewState ="true"..
是否可以在为页面本身禁用ViewState时为控件启用ViewState?
如果不是如何禁用viewstate页面上的控件,除了少数没有明确指定EnableViewState ="false"..键入相同的这么多控件是忙乱..
什么是ViewState?它是如何编码的?它加密了吗?谁使用ViewState?
我有
<h:form>
<h:commandLink action="#{my_fake_ajax_link}">
<h:outputText value="Link" />
<f:ajax render=":mydiv" />
</h:commandLink>
</h:form>
<h:panelGroup layout="block" id="mydiv">
<h:form>
<h:commandLink action="#{mybean.delete(0)}">
<h:outputText value="Here" />
<f:ajax render="@form" />
</h:commandLink>
</h:form>
</h:panelGroup>
Run Code Online (Sandbox Code Playgroud)
当我点击"my_fake_ajax_link"时,我必须在"删除"链接上单击两次.这只是一个例子.我没有这个真实案例.我在页面上有多个表单,我不能只在一个表单中添加所有表单.
我检查了问题是什么,它是:
mydiv使用ajax 进行刷新.如何添加ViewState?如何在不使用一个表单的情况下使其工作?这看起来像是一个JSF错误.我不想自动刷新该div
jQuery("#mydiv").load(document.location.href);
Run Code Online (Sandbox Code Playgroud)
但在最坏的情况下,我会尽可能的.
语境:
我经常遇到这样的情况:我们的ASP.NET页面必须在GridView上向用户显示数据,让他随心所欲地更改它(单元格上的文本框),并且只有当他实际点击时才将其保存到数据库中.保存按钮".此数据通常是页面上信息的虚拟状态,这意味着用户可以更改所有内容,而无需保存,直到他点击"保存按钮".在这些情况下,总是需要在ASP.NET回发中保留数据列表.这些数据可以是一个DataTable或只是一些的实例List<Someclass>.
我经常看到人们实现这一点并持久保存数据Session.在这种情况下,我通常也会看到一些用户导航时打开多个标签的问题,有些时候在同一页面上.两个不同选项卡的数据将合并在一起,导致信息被扰乱的问题.
如何经常使用Session的示例:
private List<SomeClass> DataList
{
get
{
return Session["SomeKey"] as List<SomeClass>;
}
set
{
Session["SomeKey"] = value;
}
}
Run Code Online (Sandbox Code Playgroud)
人们经常试图通过做这样的事情来解决它:
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
DataList = null
}
else
{
FillGridView(DataList);
}
}
Run Code Online (Sandbox Code Playgroud)
但是,当两个标签已经加载并且用户正在更改GridView值时,出于某种奇怪的原因,他试图通过点击另一页上的"保存"按钮来保存数据呢?我个人不喜欢这个选项.
其他方法是将数据放在上面ViewState.但是,当涉及到持久存在的大型列表时,它可能会在页面存储时严重影响页面(HiddenField).
但是,这项工作的最佳方式是什么?有一次,我想Session与ViewState在哪里一起使用ViewState将保存一个唯一的标识符来索引Session保存的数据.这样可以防止在浏览器上的标签之间共享数据:
private List<SomeClass> DataList
{
get
{
if (ViewState["SomeKey"] == null)
{
ViewState["SomeKey"] = Guid.NewGuid().ToString();
}
return Session[ViewState["SomeKey"].ToString()] …Run Code Online (Sandbox Code Playgroud)