我的“代码隐藏”代码都没有被调用

我刚刚在IIS中创建了一个ASP.NET C#项目和一个虚拟目录(据我所知),但是我看到了一些我从未见过的非常奇怪的行为。

似乎我的C#方法都没有被调用过。 我知道这是因为我已经覆盖了一堆方法,除了抛出exception之外什么都不做。 至少可以在浏览器中查看Default.aspx(见下文)

这是我的Default.aspx.cs文件的确切内容:

using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; namespace Drawings2 { public partial class _Default : System.Web.UI.Page { static _Default() { throw new Exception("XXX"); } public _Default() { throw new Exception("XXX"); } override protected void OnInit(EventArgs e) { /* * base.OnInit(e); * InitializeComponent(); */ throw new Exception("XXX"); } private void InitializeComponent() { /* * Load += new EventHandler(this.Page_Load); */ throw new Exception("XXX"); } protected void Page_Load(object sender, EventArgs e) { throw new Exception("XXX"); } } } 

我假设这个代码根本没有加载,因为如果是,那么每当我试图在浏览器中查看页面时我都会看到exception。 相反,.aspx文件中的内容正常显示(除了我的事件处理程序未被调用。)

当我尝试添加新的.aspx页面时,情况会变得更糟。 当我尝试在浏览器中查看新页面时出现此错误(这是使用VS2008模板中未修改的.cs文件):Parser Error

 Description: An error occurred during the parsing of a resource required to service this request. Please review the following specific parse error details and modify your source file appropriately. Parser Error Message: Could not load type 'Drawings2.WebForm1'. 

是什么导致ASP.NET站点进入这种奇怪的状态?

注意:.aspx文件中的转义仍然可以正常工作。 此外,当我在.aspx文件中添加表单字段时,我可以在.cs文件中自动完成其名称。 我在两个页面上都尝试过AutoEventWireup truefalse 。 我也尝试在所有类声明中添加和删除“部分”。


更新 – 这是我的@Page标签。 正如我所说,我试过切换AutoEventWireup 。 引用的.cs文件存在并编译,没有错误。

   

有关:

  • CodeFile与CodeBehind
  • ASP.NET:代码落后或没有代码落后?

这里有很多相互矛盾的信息。 例如,如果您真正创建了一个ASP.NET Web应用程序 (而不是一个Web站点 ),那么您应该使用CodeFile ,正如used2所建议的那样 。

您是否尝试过检查代码隐藏文件的Build Action ? 确保将其设置为“ 编译”

我认为我们需要从头开始,以确定问题是来自您的Web项目,您的IIS配置,还是两者兼而有之。

我将对您的设置做出以下假设,因为这是我目前的设置。 如果这些都是错误的,请告诉我,但它不应该产生很大的不同:

  • 您正在使用Visual Studio 2010与.NET 3.5
  • 您的Web服务器是Windows 2003
  • 您的Web服务器正在运行IIS 6.0

创建一个新的Web应用程序项目:

让我们尽量保持这一点,尽量减少任何奇怪的可能性:

  • 解决方案’TestWebApp1′
    • Project’TestWebApp1’(ASP.NET Web应用程序)
      • 属性
      • 参考
      • 应用程序数据
      • 脚本
      • Default.aspx(构建操作: 内容
        • Default.aspx.cs(构建操作: 编译
      • SiteLayout.Master(构建操作: 内容
        • SiteLayout.Master.cs(构建操作: 编译
      • Web.config文件

Default.aspx的内容:

 <%@ Page Title="" Language="C#" MasterPageFile="~/SiteLayout.Master" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="TestWebApp1.Default" %>  

This is a test

Default.aspx.cs的内容:

 using System; namespace TestWebApp1 { public partial class Default : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { lblTest.Text = "Modified from Default.aspx's Page_Load method."; } } } 

SiteLayout.Master的内容:

 <%@ Master Language="C#" AutoEventWireup="true" CodeBehind="SiteLayout.master.cs" Inherits="TestWebApp1.SiteLayout" %>    

This is a test

SiteLayout.Master.cs的内容:

 using System; namespace TestWebApp1 { public partial class SiteLayout : System.Web.UI.MasterPage { protected void Page_Load(object sender, EventArgs e) { lblTest.Text = "Modified from master page's Page_Load method."; } } } 

现在,在本地计算机上进行调试时,此站点应该可以正常工作:

网站在本地工作

部署到IIS

  1. 右键单击TestWebApp1项目,然后单击“发布”。
  2. 为简单起见,选择“文件系统”作为“发布方法”。
  3. 输入将部署文件的路径。
  4. 在您的Web服务器上,打开IIS(我将假设您正在运行IIS 6.0)
  5. 在“ 默认网站” (或您使用的任何网站)下,创建一个新的虚拟目录 。 确保它具有运行脚本的权限。
  6. 将从dev计算机发布的文件复制到IIS虚拟目录。
  7. 就是这样 – 你的网站应该工作正常。

基本VS 2010发布对话框虚拟目录访问权限

按照上述步骤后,您是否仍然遇到问题?

尝试改变:

 <%@ Page Language="C#" AutoEventWireup="false" CodeBehind="Default.aspx.cs" Inherits="Drawings2._Default" %> 

至:

 <%@ Page Language="C#" AutoEventWireup="false" CodeFile="Default.aspx.cs" Inherits="Drawings2._Default" %> 

CodeBehind适用于visual studio。 我相信CodeFile用于JIT。

另一种方法是编译项目并在bin目录中更新程序集。

http://msdn.microsoft.com/en-us/library/ydy4x04a.aspx

CodeBehind指定包含与页面关联的类的已编译文件的名称。 运行时不使用此属性。

此属性用于Web应用程序项目。 CodeFile属性用于网站项目。 有关Visual Studio中Web项目类型的详细信息,请参阅Web应用程序项目与Web站点项目。

CodeFile指定页面引用的代码隐藏文件的路径。 此属性与Inherits属性一起使用,以将代码隐藏源文件与Web页面相关联。 该属性仅对编译的页面有效。

此属性用于网站项目。

CodeBehind属性用于Web应用程序项目。 有关Visual Studio中Web项目类型的详细信息,请参阅Web应用程序项目与Web站点项目。

我学到了很多,这可能是你的问题。

确保bin文件夹位于IIS中网站的根目录中。

我有www.mysite.com/myapp/bin但是没有用,我需要在www.mysite.com/bin上安装dll,即使我的网页都在www.mysite.com/myapp里面(在我的网站上) case我在根目录中运行Wordpress,PHP和ASP.NET的东西在某个子页面中用于某些页面)

(跟踪我的情况更糟糕的是,根据以前的部署,根目录中有一个bin文件夹,我正在更新网站并想知道为什么我的代码隐藏更改没有生效)

编辑:找出如何避免将bin文件夹放在网站根目录中。 在IIS中,如果右键单击网站中的应用程序文件夹,则可以选择“转换为应用程序”(至少在IIS 7.5中不确定旧版本)。 这样做之后,该文件夹将能够使用它自己的bin和web.config

EDIT2:IIS 6和7的说明: http : //www.banmanpro.com/support2/appstartpoint.asp

我怀疑apsx文件中的页面声明( <%@ Page ... %> )是错误的。 查看ClassName和CodeBehind属性,确保它们与.cs文件匹配。

我认为IIS认为您的项目是一个“ASP.NET站点”,而您和/或您的VS.NET可能认为您实际上有一个“ASP.NET Web应用程序”。 在VS.NET中的项目上转换为Web应用程序并确保在IIS中的项目上正确配置(请参阅其他注释)虚拟目录,一切都应该正常工作。

阅读你的post和评论,我看到矛盾的评论(除非我误读)

你说:

  1. “使用”ASP.NET Web应用程序“模板(与ASP.NET站点对比)”。
  2. “我希望这不是唯一的解决方案,因为我无法做到这一点(客户要求我的应用程序位于子目录中 – 他们不会在〜或〜/ bin中允许我的任何代码。)”

“ASP.NET Web应用程序”在部署时需要编译的dll,而不是基本的.cs文件。

导致您想要用作开发者的内容与客户允许部署的内容之间的根本原因是什么?

我半定期得到运行时错误; 清除:

C:\ Documents and Settings \\ Local Settings \ Application Data \ Microsoft \ WebsiteCache C:\ WINDOWS \ Microsoft.NET \ Framework \ v2.0.50727 \ Temporary ASP.NET Files

(显然替代你)并且运行iisreset通常会为我完成这项工作。 此外,在重建之前尝试“清理”解决方案; 有时似乎有所作为。

如果您仍然遇到同样的问题,请尝试删除并重新创建对DLL的引用。

没什么太规定的我害怕但应该有希望完成工作!

这似乎是命名空间问题,因为动态编译的类与预编译的类冲突。 我建议做以下事情:

1)为您的应用选择合理的命名空间。 “绘图”很好,但我建议使用更多上下文,例如CompanyName.ProjectName.AppName

2)将此命名空间设置为项目的默认名称(“项目属性”>“应用程序”选项卡)

3)更改每个代码文件( .cs)中的命名空间及其在脚本文件中的相应引用( .aspx,* .ascx)

4)确保没有重复的类(这应该由编译器标记)

5)清除临时ASP.NET文件夹中的所有文件

6)重新编译项目

我想我之前可能遇到过类似的事情。 事实certificate,这是因为我有一个default.aspx和一个default.master,它们都自动编译为类名_default,因此获取类型存在于两个dll错误中。

从HTML视图中删除以下页面指令,构建网站并尝试在浏览器中加载页面。

 <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="Drawings2.WebForm1" %>