プログレッシブエンハンスメントについて学び、AJAX化の見解について質問があります。MVC 3プロジェクトには、レイアウトページ、ビュースタートページ、2つのプレーンビューがあります。
viewstartページはViewsフォルダーのルートにあるため、すべてのビューに適用されます。すべてのビューが_Layout.cshtml
レイアウトページに使用する必要があることを指定します。レイアウトページには、各ビューに1つずつ、合計2つのナビゲーションリンクが含まれています。リンクは@Html.ActionLink()
、ページへのレンダリングに使用されます。
今私はjQueryを追加し、これらのリンクを乗っ取り、Ajaxを使用してページにコンテンツを動的にロードしたいと考えています。
<script type="text/javascript">
$(function () {
$('#theLink').click(function () {
$.ajax({
url: $(this).attr('href'),
type: "GET",
success: function (response) {
$('#mainContent').html(response);
}
});
return false;
});
});
</script>
これを行うには、2つの方法が考えられますが、どちらも特に好きではありません。
1)ビューのコンテンツ全体を取得して、それらを部分ビューに配置し、レンダリングされたときにメインビューに部分ビューを呼び出させることができます。こうすることRequest.IsAjaxRequest()
で、コントローラーで使用して、要求がAjax要求であるかどうかに基づいて戻るView()
か戻ることができPartialView()
ます。Ajaxリクエストに通常のビューを返すことはできません。それは、レイアウトページを使用し、レイアウトページの2番目のコピーが挿入されるためです。ただし、@{Html.RenderPartial();}
標準のGETリクエストでは、aのみを含む空のビューを作成する必要があるため、これは好きではありません。
public ActionResult Index()
{
if (Request.IsAjaxRequest())
return PartialView("partialView");
else
return View();
}
次に、Index.cshtmlで次のようにします。
@{Html.RenderPartial("partialView");}
2)_viewstartからレイアウト指定を削除し、リクエストがAjaxでない場合は手動で指定できます。
public ActionResult Index()
{
if (Request.IsAjaxRequest())
return View(); // Return view with no master.
else
return View("Index", "_Layout"); // Return view with master.
}
誰かより良い提案がありますか?レイアウトページなしでビューを返す方法はありますか?ajaxリクエストの場合、「レイアウトを含めない」と明示する方が、ajaxでない場合、明示的にレイアウトを含めるよりもはるかに簡単です。