ASP.NET Coreで作成したWebアプリケーションをサーバー上で公開する場合、リンクがうまく働かない問題があります。サーバーの設定を変えれば対応できるのかもしれませんが、レンタルサーバーの場合は管理者権限がないのでどうすることもできません。

このようにcshtmlに書くと以下のように変換されます。

サブディレクトリではなくドメインやサブドメインで公開したい場合はなんの問題もありませんが、サブディレクトリで運用する場合は困ります。だからといってリンクの部分を手動で書き換えるのも大変です。

タグ ヘルパーは自分で定義することができます。だったら再定義することはできるのか? やってみるとうまくいったのでその方法を公開します。

まずこんなクラスをつくります。もしhttps://lets-csharp.com/samples/2207/first-mvcでアプリを公開したいのであれば最後のスラッシュを取ったものをGlobal.BaseUrlプロパティで取得できるようにします。クラス名とプロパティ名はほかと重複しなければなんでもかまいません。

次にaタグやlinkタグ、imgタグ、scriptタグ、formタグのタグヘルパーを再定義します。また新たにemailタグのタグヘルパーを定義します。

aタグの場合、まずhref属性があるかどうかを調べます。あれば直接 <a href=”#”>アンカーテキスト</a> と書かれている場合は変換されないようにするためにoutput.Attributes[“href”].Valueで取得されたものがstring型かどうかを調べます。string型の場合はGlobal.BaseUrlを先頭につけて再セットします。linkタグの場合も同じです。

imgタグの場合、まずsrc属性があるかどうかを調べます。あれば直接 <img src=”#” /> と書かれている場合は変換されないようにするためにoutput.Attributes[“src”].Valueで取得されたものがstring型かどうかを調べます。string型の場合はGlobal.BaseUrlを先頭につけて再セットします。scriptタグの場合も同じです。

formタグの場合、どこにpostするのかをaction属性をつかって指定するのですが、この部分を書き換えます。まずaction属性があるかどうかを調べます。ある場合はstring型かどうかを調べて、string型の場合はGlobal.BaseUrlを先頭につけて再セットします。

emailタグのタグヘルパーを定義します。

それからタグヘルパーが機能するようにするには_ViewImports.cshtmlを以下のように編集します。

Views\_ViewImports.cshtml

これで以下のように変換されます。