1

他のコントローラーが継承する基本コントローラー抽象クラスがあります。このクラスは、マスター ページのいくつかのボタンを作成するために、ローカルの xml ファイルを読み込む必要があります。この段階で ControllerContext が null であることを考えると、ファイルをロードするためのベスト プラクティスは何ですか? (Web サーバーで実行すると、「パス 'c:\windows\system32\inetsrv\Content\Xml\Buttons.xml' の一部が見つかりませんでした」というエラーが表示されます。)

現在のコードは

using System.Web.Mvc;
using Site1.Models;

namespace Site1.Controllers
{

    [SkyArts.Models.Master]
    public abstract class BaseController : Controller
    {
        public BaseController()
        {
            XDocument buttonsXmlDoc = XDocument.Load("Content/Xml/Buttons.xml");
        }
    }
}

ドキュメントは実際には Model クラスから読み込まれますが、簡潔にするために省略しています。

副次的な問題として、xml ファイルを Content と App_Data のどちらに配置しますか?

4

3 に答える 3

3

あなたの問題の解決策は、人々がここで言及したことの組み合わせだと思います。Initialize をオーバーライドし、そこに XML ドキュメントをロードします。その時点で、Server プロパティは有効である必要があります。また、Server.MapPathを使用して、Web サイトのディレクトリ階層内からリソースを取得します。

using System.Web.Mvc;
using Site1.Models;

namespace Site1.Controllers
{

    [SkyArts.Models.Master]
    public abstract class BaseController : Controller
    {
        protected override void Initialize(RequestContext rc)
        {
            base.Initialize(rc);

            XDocument buttonsXmlDoc = XDocument.Load(
                Server.MapPath("~/Content/Xml/Buttons.xml"));
        }
    }
}

さらに、Server.MapPath を呼び出すときは、リソースへのアプリケーション ルート パスを使用する (つまり、チルダ文字 "~" でパスを開始する) ことに注意してください。これが、エラー「Could not find a part of theパス 'c:\windows\system32\inetsrv\Content\Xml\Buttons.xml'.

Server.MapPath を使用しない場合、相対ファイル システム パスは実行中のプロセス (この場合は IIS) に対して相対的になります。Server.MapPath を呼び出すと、Web サイトの仮想ディレクトリ階層を基準として指定したリソースが物理ファイル システム パスに変換されます。

XML ファイルの場所に関する副次的な問題については、App_Data を使用することをお勧めします。これは、そのフォルダーに保存されているファイルが要求されたときに提供されないためです。

于 2009-04-21T12:57:42.990 に答える
2

コンストラクターで呼び出さないでください。Initializeメソッドをオーバーライドします。ControllerContextはそこでnull以外になります。または、遅延インスタンス化を使用します。

于 2009-04-21T12:38:57.280 に答える
1

Initialize をオーバーライドする代わりの方法ですが、それが最善の方法だと思います。

Server.MapPath を使用して、ドキュメント ルートへのパスを解決します。生ファイルをダウンロードできないように、App_Data も使用します。

var buttonsXmlDoc = XDocument.Load( HttpContext
                                      .Current
                                      .Server
                                      .MapPath( "~/App_Data/Buttons.xml" ) );

**編集:**あなたのコメントに基づいて、HttpContext.Current から Server オブジェクトを参照するか、他の人が指摘したように XML の読み込みを Initialize メソッドに移動することができます。後者をお勧めしますが、代わりに前者を使用して回答を更新します。

于 2009-04-21T12:12:28.840 に答える