1

我正在使用 C# ASP.NET VS2010。

我在 .aspx.cs 上有一个程序,它读取 XML 文件并且工作得很好。

它是这样的:

string fileName = "~/App_Data/" + filename + ".xml";
DataSet ds = new DataSet();
ds.ReadXml(MapPath(fileName));

我经常使用这个过程来读取各种文件的变化很小(文件名),因此,我试图把这个过程放在一个 Class1.cs 文件中(在 App_Code 文件夹中),但我收到了这个错误消息:

The type or namespace name 'MapPath' does not exist in the namespace 'Microsoft.SqlServer.Server' (are you missing an assembly reference?)

我使用此 MapPath 以这种方式将 XML 文件读入数据集:

ds.ReadXml(Server.MapPath(fileName));

文件名是前面几行声明的字符串变量:

string fileName = "~/App_Data/" + inputString + ".xml";

将此行放入 class.cs 文件后,VS2010 要求Server通过将其替换为Microsoft.SqlServer.Server本地(在同一行而不是通过添加命名空间)来解决丢失问题,因此新形式中的行如下所示:

ds.ReadXml(Microsoft.SqlServer.Server.MapPath(fileName));

作为记录,我确保源 .aspx.cs 文件上的所有命名空间都在类文件中。

为什么 Class1.cs 和 .aspx.cs 有区别?

我该如何解决这个问题?

为了从这个新的类文件中读取 XML 文件,我应该改变什么?

是否可以替代我的行来将 XML 文件读入数据集?

4

1 回答 1

5

MapPathSystem.Web.HttpServerUtility类的方法,你需要这个类的一个实例来调用该方法。在 ASP 页面中,页面的 Server 成员中提供了一个实例;在其他地方,你必须提供它。要么作为

HttpContext.Current.Server.MapPath(fileName);

如果您在其中,它将使用当前Server变量。类包含许多您用于通过成员访问的与 HTTP 相关的对象 - 例如请求、响应、服务器。静态属性为您当前正在处理的请求提供上下文。在您的 ASP Web 项目的 App_Code 文件夹中的类中,您可以安全地假设存在一个活动上下文。HttpContextHttpContextPageCurrent

如果你想将你的类移动到一个单独的程序集中,最好将服务器(或上下文)作为方法的参数,并让调用者负责提供一个参数:

public class Class1
{
    public void MyMethod(HttpServerUtility server)
    {
        //...
        server.MapPath(fileName);
        //...
    }
}

然后从 ASP 页面调用它class1instance.MyMethod(this.Server);

Microsoft.SqlServer.Server与它无关,只有类/成员名称相同,Visual Studio 弄错了。

于 2012-04-30T06:58:15.633 回答