众所周知,似乎ASP.NET应用程序总是抛出一些无效的Viewstate错误,但现在我实际上找到了一种在我的站点上重现一个的方法。
正在发生的事情是用户正在尝试访问不存在的页面而且我执行了以下操作:
if (CurrentItem == null) {
throw new HttpException(404, "Page not found");
}
这会将用户重定向到我们的自定义404页面。这个404页面只是我们系统中的一个常规页面,我们通过web.config重定向到该页面。搜索功能在此页面上可见。但是当我从这个页面做回发时,错误似乎发生了。所以,如果你去看看。
http://alternativeto.net/software/doesntexist
然后使用右上角的搜索表单并输入例如Dropbox,点击回车(如果你得到一个自动建议不点击那个因为它只会链接你到那个应用程序)和baam,你得到错误是“无效的视图状态”bla bla。
任何人都知道如何解决这个问题?我是如何抛出404错误的?我可以想象它有重定向到自定义404页面的东西todo和viewstate和asp.net魔法在某种程度上处于某种无效状态?也许我可以在web.config中更改一些内容来纠正这个问题?
感谢您的帮助!想要摆脱尽可能多的错误当然:)
更新
好像我自己解决了这个问题。当MS有这样的安全漏洞,他们建议修改错误重定向到的 redirectMode =“ResponseRewrite” 的当我把它改成的 redirectMode =“ResponseRedirect” 的它似乎好工作!< / p>
更新2
但我也意识到我宁愿拥有ResponseRewrite解决方案,因为它会留在那个得到错误的URL上,而且更加清晰。所以我仍然很乐意找到一个与ResponseRewrite一起使用的解决方案。
答案 0 :(得分:0)
搜索框应该始终使用GET,而不是POST(!!)。因此,不要使用回发进行搜索,使用表单方法=“get”action =“searchpage”装饰您的文本框,并且您可以免费回家,并且所有访问者都会更快乐
答案 1 :(得分:0)
我遇到了同样的问题,我相信它是因为在responseMode="ExecuteURL
内使用<httpErrors>
使用的是Server.Transfer,这就是为什么网址不会改变的原因。 /contact
到/404
。
这意味着主表单上的操作将保留为/contact
并将回发到该页面,但由于我们已转移到/404.aspx
,因此会抛出无效的视图状态。
我的解决方案是设置404和prerender上的表格动作。 500页到请求的路径而不是RawUrl。
protected void Page_PreRender(object sender, EventArgs e)
{
var form = (HtmlForm)this.Master.FindControl("Form1");
if (form != null)
form.Action = Request.Path;
}
即使这个问题已经很久了,我也不得不发布这个问题,因为它可能会在未来为人们节省几个小时的麻烦。