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

时间:2011-02-02 20:28:41

标签: c# asp.net iis asp.net-3.5

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

似乎我的C#方法的 none 一直被调用。我知道这是因为我已经覆盖了一堆方法,除了抛出异常之外什么都不做。至少可以在浏览器中查看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");
        }
    }

}

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

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

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文件中自动完成其名称。我在两个页面上都为true尝试了falseAutoEventWireup。我也尝试在所有类声明中添加和删除“部分”。


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

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

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

相关:

9 个答案:

答案 0 :(得分:13)

尝试更改:

<%@ 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应用程序项目   网站项目。

     

CodeFile 指定引用的代码隐藏文件的路径   页。此属性一起使用   使用Inherits属性   关联代码隐藏源文件   用网页。属性是   仅对编译页面有效。

     

此属性用于网站   项目。

     

CodeBehind属性用于   Web应用程序项目。更多   有关Web项目类型的信息   Visual Studio,请参阅Web应用程序   项目与网站项目。

答案 1 :(得分:4)

这里有很多相互矛盾的信息。例如,如果您真的正在创建 ASP.NET Web应用程序(而不是网站),那么不应该正在使用CodeFileused2could suggests

您是否尝试过检查代码隐藏文件的构建操作?确保将其设置为编译

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

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

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

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

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

  • 解决方案'TestWebApp1'
    • 项目'TestWebApp1'(ASP.NET Web应用程序)
      • 属性
      • 参考
      • App_Data文件
      • 脚本
      • 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" %>
<asp:Content ID="Content2" ContentPlaceHolderID="mainCPH" runat="server">
    <p><asp:Label ID="lblTest" runat="server">This is a test</asp:Label></p>
</asp:Content>

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" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
    <body>
        <form id="form1" runat="server">
            <div>
                <p><asp:Label ID="lblTest" runat="server">This is a test</asp:Label></p>
                <asp:ContentPlaceHolder ID="mainCPH" runat="server">
                </asp:ContentPlaceHolder>
            </div>
        </form>
    </body>
</html>

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.";
        }
    }
}

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

site working locally

部署到IIS

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

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

答案 2 :(得分:2)

我很难学到这一点,这可能是你的问题。

确保bin文件夹位于IIS中网站的 root 中。

我有www.mysite.com/myapp/bin而且没有用,我需要在www.mysite.com/bin中设置dll,即使我的页面都在www.mysite.com/myapp内(在我的情况下我运行了Wordpress)在根目录中,PHP和ASP.NET的东西在某个页面的子文件夹中)

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

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

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

答案 3 :(得分:1)

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

答案 4 :(得分:1)

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

阅读你的文章&amp;评论,我看到相互矛盾的评论(除非我误读)

你说:

  1. “使用”ASP.NET Web 应用程序“模板(与ASP.NET相对) 网站)“。
  2. “我希望这不是 唯一的解决方案,因为我无法解决 这样做(客户要求我的 应用程序位于子目录中 - 他们 不允许我或我的任何代码 〜/箱)。“
  3. “ASP.NET Web应用程序”在部署时需要编译的dll,而不是基本的.cs文件。

    根本原因是您想要用作开发者的内容与客户允许部署的内容之间的概念混淆吗?

答案 5 :(得分:1)

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

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

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

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

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

答案 6 :(得分:1)

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

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

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

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

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

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

6)重新编译项目

答案 7 :(得分:0)

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

答案 8 :(得分:0)

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

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