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

时间:2012-05-08 19:29:16

标签: 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("./" + 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();
    }
}
}

以下是引用它的页面:

<% @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>

我得到的错误是上面列出的错误,即:

  

编译器错误消息:CS0120:非静态字段,方法或属性'System.Web.UI.Page.Server.get'

需要对象引用

在以下行中:

  

第5行:字符串路径= Server.MapPath(“./”+ filename);

4 个答案:

答案 0 :(得分:9)

Server仅适用于System.Web.UI.Page - 实现的实例(因为它是实例属性)。

您有两个选择:

  1. 将方法从static转换为实例
  2. 使用以下代码:
  3. (创建System.Web.UI.HtmlControls.HtmlGenericControl

    的开销
    public static string FooMethod(string path)
    {
        var htmlGenericControl = new System.Web.UI.HtmlControls.HtmlGenericControl();
        var mappedPath = htmlGenericControl.MapPath(path);
        return mappedPath;
    }
    

    或(未经测试):

    public static string FooMethod(string path)
    {
        var mappedPath = HostingEnvironment.MapPath(path);
        return mappedPath;
    }
    

    或(不是那个好选项,因为它以某种方式假装为静态,而只是静态用于webcontext-calls):

    public static string FooMethod(string path)
    {
        var mappedPath = HttpContext.Current.Server.MapPath(path);
        return mappedPath;
    }
    

答案 1 :(得分:1)

使用HttpContext.Current怎么样?我想你可以用它在静态函数中引用Server

此处描述:HttpContext.Current accessed in static classes

答案 2 :(得分:1)

我在一段时间后遇到了类似的事情 - 简单地说,你不能从静态方法中的.cs代码隐藏中提取Server.MapPath()(除非后面的代码以某种方式继承了一个网页类,反正可能是不允许的。)

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

Code Behind(.CS):


public static void doStuff(string path, string desc)
{
    string oldConfigPath=path+"webconfig-"+desc+"-"+".xml";

... now go do something ...
}

网页(.ASPX)方法调用:


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

不需要打击或谈论OP,这似乎是一种合理的混淆。希望这会有所帮助...

答案 3 :(得分:0)

public static string includer(string filename) 
{
        string content = System.IO.File.ReadAllText(filename);
        return content;
}


includer(Server.MapPath("./" + filename));