1

C#ASP.NETVS2010を使用しています。

.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ページでは、インスタンスはページのサーバーメンバーで利用できます。他の場所では、それを提供する必要があります。どちらかとして

HttpContext.Current.Server.MapPath(fileName);

あなたが1つの中にいるなら、これServerは現在の変数を使用します。クラスには、Request、Response、Serverなど、メンバーを介してアクセスするために使用される多くのHTTP関連オブジェクトが含まれています。staticプロパティは、現在処理しているリクエストのコンテキストを提供します。ASP WebプロジェクトのApp_Codeフォルダー内のクラス内には、アクティブなコンテキストがあると想定しても問題ありません。HttpContextHttpContextPageCurrent

クラスを別のアセンブリに移動する場合は、サーバー(またはコンテキスト)をメソッドのパラメーターにし、呼び出し元がパラメーターを指定するようにすることをお勧めします。

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

ASPページからは、次のように呼び出されます。class1instance.MyMethod(this.Server);

Microsoft.SqlServer.Serverそれとは何の関係もありません。クラス/メンバー名だけが同じで、VisualStudioが間違っています。

于 2012-04-30T06:58:15.633 に答える