14

我最近开始将 ASP.NET 项目从 .NET 版本 1.1 迁移到 4.0。该系统目前在客户站点上运行并且可以正常工作。当我通过 VS 向导迁移解决方案时,我没有收到任何错误。错误是没有服务器控件事件起作用,并且视图状态始终为空

我已经尝试明确设置ViewStateMode为 Enabled 和AutoEventWireuptrue。不幸的是,没有任何效果。该项目不是作为 Web 应用程序编写的(转换不能解决问题)。

我还检查了是否所有服务器控件都设置了 ID(它们确实设置了)。

该项目有自己的母版页系统,System.Web.UI.Page 上有一层厚厚的层,可能会破坏很多东西,但到目前为止我还没有找到问题的根源。

是否有任何我应该检查的特定设置(即自 .NET 1.1 以来更改的默认值)或者你能给我一些提示为什么会发生这种情况?

编辑 1:这些是单击链接按钮时发布的值:

CRC =-2134936892& _ EVENTTARGET =MPage%24BC%24TestButton&_EVENTARGUMENT =& _ VIEWSTATE =&_EVENTVALIDATION =%2FwEWAwL%2BraDpAgLB49K8AwKy8rFAt4Axk3NlUEWxrtY%2FRtaexH%2F634CkJe6G9Im5EOPXtVw%3D

编辑 2:我仔细检查了自定义母版页机制,发现它Server.Transfer(...)在跳转到正确的页面之前广泛使用了方法。这是缺少 ViewState 的可能原因吗?(那么奇怪的是,EventTarget 总是保持不变)更重要的是,1.1 和 4.0 之间会不会有任何变化?

4

3 回答 3

4

你检查了这个链接吗?http://www.asp.net/whitepapers/aspnet4/break-changes

在页面的更深处指出,当FORM' 的操作为空时,会发生以下情况:

  1. 一个 .aspx 页面被发送到浏览器,其中 form 元素的 action 属性设置为“”。
  2. 该表单被回发到 ASP.NET。
  3. 托管 HTTP 模块读取实体主体的某些部分。例如,一个模块读取 Request.Form 或 Request.Params。这会导致 POST 请求的实体主体被读入托管内存。因此,实体主体不再可用于在 IIS 7 或 IIS 7.5 集成模式下运行的任何本机代码模块。
  4. IIS DefaultDocumentModule 对象最终运行并创建对 Default.aspx 文档的子请求。但是,由于实体主体已被一段托管代码读取,因此没有可用于发送给子请求的实体主体。
  5. 当 HTTP 管道针对子请求运行时,.aspx 文件的处理程序在处理程序执行阶段运行。
  6. 因为没有实体主体,所以没有表单变量和视图状态,因此 .aspx 页面处理程序没有可用信息来确定应该引发什么事件(如果有)。因此,受影响的 .aspx 页面的任何回发事件处理程序都不会运行。您可以通过以下方式解决此问题:

编辑:我们在两年前迁移到 3.5 时遇到了类似的问题......我们所做的是使用带有 Web App 项目类型的 VS2005 作为桥梁,所以我们的迁移路径是:

  • 1.1 到 2.0
  • 2.0 到 3.5

这是我们最后的手段,也是在找到这份文件之前。

于 2012-08-06T10:30:36.653 回答
1

迁移完成后,

如果是 Web 应用程序:

这是一个清单:

  1. 尝试在 Visual Studio 2010 的设计模式下更改 .NET 服务器控件的值。(从其框架 4.0 开始,您将使用 Visual Studio 2010)更改它包括:更改服务器控件的大小或任何其他属性。这将迫使设计者生成服务器端的设计者代码。

  2. 确保清理解决方案并重建它。我曾经遇到过类似的问题,他们曾经在设计师更改设计后修复,偶尔会出错。它在迁移过程中没有给出错误。

  3. 保存表单并进行测试。

  4. 在 Firefox 中使用 Firebug 检查加载网页时是否有任何 javascript 脚本错误。

    希望这会有所帮助。

于 2012-08-03T10:02:59.147 回答
1

这可能会也可能不会解决问题,但是如果您查看堆栈上的这篇文章为什么生产服务器上的表单操作属性为空?它谈到了在 ASP.NET 3.5 sp1 中引入的以表单的 action 属性为中心的重大变化——它可能是一个开始的地方!

过去我不得不做类似的事情,这可能是一个艰苦的过程,尤其是当您拥有“自定义母版页”功能时(我必须这样做)。我会选择一个非常基本的页面 - 我们有一个 BasePage 由 CustomPage 继承,而后者又可以由 AdminBasePage 继承,然后是 Admin 页面等。如果您选择一个相对简单的页面并在早期设置断点页面构建过程尽可能,然后一直 F10 直到它呈现它可能会显示事物被调用两次的位置(这在我们的案例中发生了很多,并且是导致一些值被覆盖等问题的原因)。

在回答您的 server.transfer 问题“编辑 2”时,我发现了这个资源http://www.codeproject.com/Tips/74472/ViewState-and-Server-Transfer-Best-practices,它解释了如何确保(希望) viewstate 和 server.transfer 继续协调工作。我每天都在不断地回答这个问题——请务必发布更多关于你的进展情况的更新。你有我最深切的同情!

于 2012-08-03T09:54:50.477 回答