9

所以我有两个功能,我遇到了一个有趣的问题。本质上,我的目标是让我的代码在一个易于包含的 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("./" + 文件名);

4

4 回答 4

10

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

您有 2 个选项:

  1. 将方法从静态转换为实例
  2. 使用以下代码:

(创建的开销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;
}
于 2012-05-08T19:31:52.293 回答
1

怎么用HttpContext.Current?我认为您可以使用它来获取对Server静态函数的引用。

此处描述:在静态类中访问的 HttpContext.Current

于 2012-05-08T21:23:30.670 回答
1

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

我的简单解决方法是让方法背后的代码将路径作为参数捕获,然后调用网页在调用期间使用 Server.MapPath 执行该方法。

代码背后(.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 交谈,这似乎是一种合理的混淆。希望这可以帮助 ...

于 2014-01-21T00:04:54.623 回答
0
public static string includer(string filename) 
{
        string content = System.IO.File.ReadAllText(filename);
        return content;
}


includer(Server.MapPath("./" + filename));
于 2012-05-08T19:36:57.363 回答