我正在使用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文件读入数据集?
MapPath是System.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错了.