ハロの外部記憶インターフェイス

そろそろ覚える努力が必要かも…

ASP.NET MVCをIISの仮想フォルダに公開したら404エラーになる件

エラーの原因

ASP.NETのルーティングとJavascriptのURL実行部をIISの仮想フォルダまでは考慮していなかったため、ルーティングが失敗し、存在しないページを探しに行ってエラーになる感じ

エラーになる主な部分

  • HTML部のformactionとスクリプトソース設定の方が失敗していました。
<form method="post" enctype="multipart/form-data">
    <button itype="submit" formaction="/Home/Action1" >処理</button>
</form>
<script src="~/Scripts/IMyScript.js"></script>
  • javascriptは言うこともないが、パス合わなくなりますね。
    var ret = $.ajax({
        type: 'GET',
        url: '/Home/Action1',
        async: false
    }).responseText;

対応した部分

  • RouteConfigに仮想フォルダ用のルーティングを追加
routes.MapRoute(
    name:="SUB",
    url:="SUB/{controller}/{action}/{code}",
     defaults:=new {controller = "Home", action = "Index", code = UrlParameter.Optional}
)
  • View部分には@Url.Contentを使用
<form method="post" enctype="multipart/form-data">
    <button itype="submit" formaction='@Url.Content("~/Home/Action1")' >処理</button>
</form>
<script src='@Url.Content("~/Scripts/IMyScript.js")'></script>

*JavascriptにはルートのUrlを再生性するため、_Layoutにルート情報を隠しといて再生成関数を配置

<input id="hdnRootUrl" type="hidden" value='@Url.Content("~/")' />
var myurl = $('#hdnRootUrl').val() +  '/Home/Action1';
myurl.replace('//', '/');
 var ret = $.ajax({
     type: 'GET',
     url: myurl,
     async: false
 }).responseText;