【ワテの備忘録】ASP.NET MVCのControllerでプロジェクトのパスを取得する

この記事は約6分で読めます。
スポンサーリンク

このところ、ASP.NET MVCでWEBサイトを作る事がたまにある。

ワテ自作の各種WEBサイトはここから行ける。

使い易い地図サイト ワレモバ http://www.wareko.net/WarekoMapsMobile/
便利ツール http://www.wareko.net/home/Home/Tools

どのサイトも、今話題の超人気サイトだwww

 

さて、ASP.NET MVCでWEBサイトを作成していると、いろんな問題に直面する。

そう言う場合にはネットで検索して解決方法を見付けるのだが、折角見付けても直ぐに忘れるので備忘録としてメモしておく事にした。

 

テスト環境は以下の通り。

Windows 10 x64 Professional
Visual Studio 2017 Community
.Net Frameworkバージョン 4.6.2

では、本題に入ろう。

スポンサーリンク
ワテ推薦のプログラミングスクールで学ぶ
スポンサーリンク
スポンサーリンク

ASP.NET MVCの基本動作

ASP.NET MVC初心者のワテの理解では、MVCとはこんな感じか。

間違っているかもしれないが。

MVC ファイルのパス
View Views/Home/Index.cshtml 
Controller Controllers/HomeController.cs
Model Models/自作のクラス定義など

ASP.NET MVCではクライアントサイドで Index.cshtml のページが開かれると、サーバーサイドでは HomeControllerクラスの中に書いた関数 Index() が実行される。

そのIndex() の戻り値で

return View(Modelデータ) ;

として呼び出し元の Index.cshtml に Modelデータを渡す。

Index.cshtmlではそのModelデータを描画する。

これで目的のデータがクライアントのブラウザーに表示出来る。

サーバーサイドでファイルを読み書きする方法

例えばクライアントが Index.cshtml を表示するとサーバーサイドでは Index() アクションがコールされる。

この場合、サーバーサイドはWindows Server 2012 R2などのサーバーOSであり、WEBサーバーとしてはIISが動いている。

その Index() の中でファイルを読みたくなる事も時々ある。

何らかの初期設定情報など。

public class HomeController : Controller
{
 
    public ActionResult Index()
    {
        string pathMyRoot1 = ControllerContext.HttpContext.Server.MapPath("~/");
        string pathMyRoot2 = HostingEnvironment.MapPath("~/");   // static関数内で利用出来る。
        var pathFName1 = Path.Combine(pathMyRoot1, @"text.txt");
        var lines = System.IO.File.ReadAllLines(pathFName1, System.Text.Encoding.UTF8).ToList();
        ...
    }

その為には、Windows Server上に保存されているASP.NET MVCプロジェクトのフォルダのパスが必要になる。

http://www.example.com/... 

などのWEBページのアドレスではなくて、フォルダのパスだ。

C:\inetpub\wwwroot\maps\v4.0.1\...

こんなパスを取得したい。

ASP.NET MVCプロジェクトの物理フォルダのパスを取得したい

最初に覚えたのはこの方法。

        string pathMyRoot1 = ControllerContext.HttpContext.Server.MapPath("~/");

ControllerContext.HttpContextなどの意味は全く分かっていない。

兎に角、このように書けばそのプロジェクトの絶対パスが得られる。

ところが、何らかの事情があって、static な関数内でこの方法を使おうとすると、こんなエラーになる。

重大度レベル コード 説明 プロジェクト ファイル 行 抑制状態
エラー CS0120 静的でないフィールド、メソッド、またはプロパティ ‘ControllerBase.ControllerContext’ で、オブジェクト参照が必要です

static関数内でも利用できるこの方法

それを回避するためには、static関数内でも利用できるこの方法で行ける。

       string pathMyRoot2 = HostingEnvironment.MapPath("~/");   // static関数内で利用出来る。  

その為には、以下のusingが必要になる。

using System.Web.Hosting;

まあ、ASP.NET MVC初心者のワテの場合、兎に角プロジェクトのパスが得られれば良いので、前者あるいは後者を適当に使い分けているが、詳しい事はよく知らない。

そもそも同じような機能を持つ関数が複数ある事自体、混乱の元だと思う。

さらに一方は static な関数内では利用できないなど、ますますややこしい。何でそんな事になっているのかは知らないが、まあ仕方ない。

 

つづく。

まとめ

アマゾンで本を買う。

マイクロソフト公式解説書と言うくらいだから、ASP.NET MVCの勉強には最適なのかな?

ワテは読んでいないので分からない。各自、アマゾンレビューなどで確認して下さい。

 

ASP.NET MVCの場合、最新版は MVC5 なのかな?

ASP.NET MVC Core と言うのも出てきたのでややこしい。

 

本日の時点でベストセラー1位だ。

著者は、C++、C#、VisualBasic など数多くの解説書を書いている人のようだ。

スポンサーリンク
ワテ推薦のプログラミングスクールで学ぶ
コメント募集

この記事に関して何か質問とか補足など有りましたら、このページ下部にあるコメント欄からお知らせ下さい。

ASP.NET C# Visual Studio
スポンサーリンク
warekoをフォローする
スポンサーリンク
われこ われこ

コメント