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;