MVC

asp.net MVC AJAX 部分更新について

ASP.NET MVCの Razorにて、AJAXを使用して部分更新を実現しようとしたところ、うまく更新されずにハマりました。

いろいろ調べていくと、コントローラーでの Request.IsAjaxRequest() がfalseを返していまして、どうもこの辺りに問題がありそう。

結果的には、以下の参照を_layout.shtml に追加することで解決しました。なお、バージョンはそれぞれの環境によって異なります。

<script src="~/Scripts/jquery-1.10.2.js" type="text/javascript"></script>
<script src="~/Scripts/MicrosoftAjax.js" type="text/javascript"></script>
<script src="~/Scripts/MicrosoftMvcAjax.js" type="text/javascript"></script>
<script src="~/Scripts/jquery.unobtrusive-ajax.js" type="text/javascript"></script>

asp.net MVC リダイレクト時のURLについて

RedirectToAction にて詳細画面(edit)から一覧画面(index)に戻ると、URLが詳細画面のままになっている事があります。これだけならまだしも、先回と同じ遷移先だとボタンを押しても動作しないという不具合になります。いろいろ調べると、jquery mobile を使用した時に起こるようです。

この現象は、data-url を指定することで解消できます。MVCではsharedフォルダの_layout.cshtml が対象となります。下記例ではコントローラー側でViewBagに格納したURLを表示するようになっています。

<body>
        <div data-role="page" data-theme="b" data-url="@ViewBag.DataUrl">
            <div data-role="header">
                @if (IsSectionDefined("Header")) {
                    @RenderSection("Header")
                } else {
                    <h1>@ViewBag.Title</h1>
                    @Html.Partial("_LoginPartial")
                }
            </div>
            <div data-role="content">
                @RenderBody()
            </div>
        </div>
        @Scripts.Render("~/bundles/jquery", "~/bundles/jquerymobile")
        @RenderSection("scripts", required: false)
</body>

コントローラー側では、一覧画面(index) にてセットします。

public ActionResult Index()
 {
 	var path = HttpRuntime.AppDomainAppVirtualPath;
 	ViewBag.DataUrl = path + "/Settings";
 	return View();
 }

 

asp.net MVC IISの設定

MVCプロジェクトを作成すると、デフォルトではIIS EXPRESSにてデバッグするように設定されています。これをIISにてデバッグするよう変更します。

プロジェクトのプロパティから、Webを選択します。「IIS Expressを使用する」のチェックを外し、「仮想ディレクトリの作成」をクリックします。

mvc001

「F5」にてデバッグを開始すると、無事にIISにて起動しました。

mvc002