为什么我可以在App_Code中为ASP.NET项目访问静态类方法而不是MVC2项目?

时间:2011-03-23 18:20:52

标签: c# asp.net asp.net-mvc

在同一个asp.net MVC2项目(当它是纯ASP.NET项目时没问题),我在App_Code中创建了2个没有命名空间的类,一个是普通类,另一个是是静态的。

我可以从任何地方访问实例类的公共方法,我无法访问静态类的公共方法。为什么?那我怎么才能访问它们呢?

    public class MyWebservice
    {

        public stMyWebservice()
        {                                       

        }

        public String getText() {
        }
    }


    public static class Helper
    {

        public static String getText()
        {




        }
    }

我像这样访问index.aspx中的静态类:

<%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage" %>
<script runat="server">
    protected void Page_Load(object sender, EventArgs e)
    {
        Helper.getText();                  
    }
</script>

<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
    Home Page
</asp:Content>

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
    <h2><%: ViewData["Message"] %></h2>
    <p>
        To learn more about ASP.NET MVC visit <a href="http://asp.net/mvc" title="ASP.NET MVC Website">http://asp.net/mvc</a>.
    </p>
</asp:Content>

2 个答案:

答案 0 :(得分:7)

您的静态类应该可以作为另一个类访问。我的猜测是你声明了没有public访问修饰符的静态类,例如:

static class MyClass
{
}

如果您以这种方式声明了该类,它将具有internal访问修饰符。这意味着,它将在组装中可访问。 App_Code文件夹编译成一个程序集,如果你试图在App_Code文件夹之外使用你的类,你将收到一个错误。

编辑:还有一个 - 在这种情况下,该类是否声明为static没有区别。如果类具有相同的访问修饰符,则每个类都可以在第二个类的位置访问。

因此,由于您提供的不是确切的类声明,我的第二个猜测是:您已将静态类声明为非静态类,例如:

public class MyWebservice
{
    public static class Helper
    {
        public static String getText()
        {
        }
    }
}

在这种情况下,静态类也可以通过父类名访问:

var text = MyWebservice.Helper.getText()

最后,我创建了一个简单的网站来演示并将其发布到google docs

编辑II:您的上次编辑显示您实际上有一个 Web应用程序,而不是一个网站。对于Web应用程序App_Code文件夹不是必需的。在网站中,类文件在运行时动态编译,并且必须位于App_Code文件夹中。在Web应用程序中,所有内容都是静态编译的,类文件可以存在于Web应用程序的任何位置。

在这种情况下,我在文件夹中的代码文件的错误Build Action中看到了此行为的原因。我猜它设置为Content但应该设置为Compile(您可以通过在代码文件上按F4来实现)。

答案 1 :(得分:7)

确保该课程的构建操作设置为编译

转到 App_Code 文件夹,然后选择您的课程。查看属性页面。查找构建操作。将其设置为编译。然后,您应该可以在应用程序的其他位置访问该对象的方法和属性。