C# 非静态字段、方法或属性需要对象引用';System.Web.UI.Page.Server.get';

C# 非静态字段、方法或属性需要对象引用';System.Web.UI.Page.Server.get';,c#,asp.net,inheritance,object,server.mappath,C#,Asp.net,Inheritance,Object,Server.mappath,所以我有两个函数,我得到了一个有趣的问题。本质上,我的目标是使我的代码在一个易于包含的cs文件中更具可移植性 下面是所说的cs文件: namespace basicFunctions { public partial class phpPort : System.Web.UI.Page { public static string includer(string filename) { string path = Server.MapPath("./" + filenam

所以我有两个函数,我得到了一个有趣的问题。本质上,我的目标是使我的代码在一个易于包含的cs文件中更具可移植性

下面是所说的cs文件:

namespace basicFunctions {
public partial class phpPort : System.Web.UI.Page {
    public static string includer(string filename) {
        string path = Server.MapPath("./" + filename);
        string content = System.IO.File.ReadAllText(path);
        return content;
    }
    public void returnError() {
        Response.Write("<h2>An error has occurred!</h2>");
        Response.Write("<p>You have followed an incorrect link. Please double check and try again.</p>");
        Response.Write(includer("footer.html"));
        Response.End();
    }
}
}
命名空间基本函数{
公共部分类phpPort:System.Web.UI.Page{
公共静态字符串includer(字符串文件名){
字符串路径=Server.MapPath(“./”+文件名);
字符串内容=System.IO.File.ReadAllText(路径);
返回内容;
}
public void returnError(){
Write(“发生错误!”);
回答。写(“您使用的链接不正确。请仔细检查并重试。

”; Write(includer(“footer.html”); Response.End(); } } }
以下是引用它的页面:

<% @Page Language="C#" Debug="true" Inherits="basicFunctions.phpPort" CodeFile="basicfunctions.cs" %>
<% @Import Namespace="System.Web.Configuration" %>

<script language="C#" runat="server">
void Page_Load(object sender,EventArgs e) {
    Response.Write(includer("header.html"));
    //irrelevant code
    if ('stuff happens') {
        returnError();
    }
    Response.Write(includer("footer.html"));
}
</script>

无效页面加载(对象发送方,事件参数e){
Write(includer(“header.html”);
//无关代码
如果(‘事情发生了’){
returnError();
}
Write(includer(“footer.html”);
}
我得到的错误是上面列出的错误,即:

编译器错误消息:CS0120:非静态字段、方法或属性“System.Web.UI.Page.Server.get”需要对象引用

在以下行:

第5行:字符串路径=Server.MapPath(“./”+文件名)

仅对
System.Web.UI.Page
-实现的实例可用(因为它是实例属性)

您有两种选择:

  • 将方法从静态转换为实例
  • 使用以下代码:
  • (创建
    System.Web.UI.HtmlControls.HtmlGenericControl
    的开销)

    或(未测试):

    或者(这不是一个好的选择,因为它在某种程度上假装是静态的,但只在webcontext调用中是静态的):


    如何使用
    HttpContext.Current
    ?我认为您可以使用它在静态函数中获取对服务器的引用


    此处描述:

    不久前,我遇到了类似的事情——简单地说,您无法从静态方法中的.cs代码中提取Server.MapPath()(除非该代码以某种方式继承了web页面类,这可能是无论如何都不允许的)

    我的简单修复方法是让代码隐藏方法捕获路径作为参数,然后调用web页面在调用期间使用Server.MapPath执行该方法

    代码隐藏(.CS):

    网页(.ASPX)方法调用:

    
    ...
    doStuff(Server.MapPath("./log/"),"saveBasic");
    ...
    

    没有必要抨击或贬低OP,这似乎是一种合理的困惑。希望这有帮助…

    OP是子类化的
    System.Web.UI.Page
    。这不是OP的问题。这是OP的问题-他无法区分静态和实例属性。。。我已经清楚地说明了…的例子当然,你的答案现在更清楚了。你最初的回答暗示OP没有使用那个课程。我们不要假设,好吗?知道别人在你做那件事时说了些什么吗@用户798080 sry。。。如果还有一个编辑按钮。。。我不想显得傲慢,但是。。。我自己也遇到过这个问题,所以我显然毫无疑问会在这里发现真正的问题(顺便说一句,我希望我的评论没有粗鲁的言辞——但我担心它有……这根本不是有意的!)。。。很高兴我的回答帮助了你!我强烈建议您不要重复php的错误。相反,我们应该看看母版页是如何工作的,或者直接转到MVC。并不是所有人都认为PHP的编码风格是错误的。对于我们这些拥有更传统的编码背景的人来说,这种背景以牺牲生产速度(虽然不是运行时)或高度关注对象为代价,为我们提供了更低级的控制和编码灵活性,这确实让我们感觉有点自在。此外,文档的better=P。此外,我发现你越深入ASP.NET兔子洞,你的HTML和JavaScript就越糟糕(因为它开始大量生成)。XHTML、JSLint等对我来说很重要,所以我更愿意让尽可能多的代码依赖于自己。我认为微软官方认可的方式没有错。然而,说它本质上更好,因为它是人们告诉你要做的事情,这有点不真实,因为它通常会创建具有更大内存占用、更多常见错误安全漏洞和更多行代码的代码。当然,另一方面,在许多方面,对于有许多单独程序员一起工作的大型生产工作场所来说,它也更好。不同的编码风格,仅此而已。不过,恐怕我会一直在PHP阵营。(此外,现代C#将永远有IIS的阻碍,让我认真使用。Mod#u Mono可以为您提供良好的基本支持,但如果您想高效地完成任何复杂的工作,您需要为非Windows/非IIS服务器使用另一种语言)@user798080我建议进一步探索.NET系列。。。它主要不是关于ASP.NET的。WCF、WPF(以及深受喜爱的Silverlight)当然还有控制台和服务应用程序(以及可以与.NET一起使用的任何其他组件)是另一个重要部分。使用.NET(以及以独立于组件的方式编码)的主要好处是为您带来了代码共享和重用的巨大好处,而这正是所有大型玩家所追求的主要问题!随着您对.NET的深入了解,您将以最简单的方式了解chrislive的真正含义!您可以将各种机密信息放入CS中,传递mappath命令不会泄露任何机密信息。
    public static string FooMethod(string path)
    {
        var mappedPath = HostingEnvironment.MapPath(path);
        return mappedPath;
    }
    
    public static string FooMethod(string path)
    {
        var mappedPath = HttpContext.Current.Server.MapPath(path);
        return mappedPath;
    }
    
    public static string includer(string filename) 
    {
            string content = System.IO.File.ReadAllText(filename);
            return content;
    }
    
    
    includer(Server.MapPath("./" + filename));
    
    
    public static void doStuff(string path, string desc)
    {
        string oldConfigPath=path+"webconfig-"+desc+"-"+".xml";
    
    ... now go do something ...
    }
    
    
    ...
    doStuff(Server.MapPath("./log/"),"saveBasic");
    ...