一旦将程序移动到C#类文件,"MapPath"方法就会停止工作

Dif*_*222 1 c# asp.net

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

我在.aspx.cs上有一个程序,它读取XML文件并且运行正常.

它是这样的:

string fileName = "~/App_Data/" + filename + ".xml";
DataSet ds = new DataSet();
ds.ReadXml(MapPath(fileName));
Run Code Online (Sandbox Code Playgroud)

我使用这个过程很多只读取各种文件(文件名),因此,我试图将该过程放在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?)
Run Code Online (Sandbox Code Playgroud)

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

ds.ReadXml(Server.MapPath(fileName));
Run Code Online (Sandbox Code Playgroud)

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

string fileName = "~/App_Data/" + inputString + ".xml";
Run Code Online (Sandbox Code Playgroud)

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

ds.ReadXml(Microsoft.SqlServer.Server.MapPath(fileName));
Run Code Online (Sandbox Code Playgroud)

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

为什么Class1.cs和.aspx.cs之间存在差异?

我该如何解决这个问题?

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

是否有替换我的行来将XML文件读入数据集?

voi*_*ine 5

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

HttpContext.Current.Server.MapPath(fileName);
Run Code Online (Sandbox Code Playgroud)

如果你在里面,它会使用Server变量作为当前值HttpContext.HttpContextclass包含许多您用于通过Page成员访问的HTTP相关对象- 如Request,Response,Server.在Current静态属性给出了你当前正在处理请求的情况下.在ASP Web项目的App_Code文件夹中的内部类中,您可以安全地假设存在活动上下文.

如果您想将类移动到单独的程序集中,最好将Server(或Context)作为方法的参数,并让调用者负责提供一个:

public class Class1
{
    public void MyMethod(HttpServerUtility server)
    {
        //...
        server.MapPath(fileName);
        //...
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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