現在、ASP.NET MVC3 でサイトをセットアップしていますが、すべてのレイアウトがモバイル デバイス用に最適化されています。
デスクトップ ブラウザーやタブレットの追加の画面スペースを活用するために、いくつかの既存のビューを組み合わせたいと思います。
1 つはリンクのリストを表示し、もう 1 つは各リンクによって生成されたコンテンツを表示します。これらのビューは両方とも、別々のコントローラーによって処理されます。これがリストビューです(簡略化)。これはレイアウト ページを使用するため、レイアウトで@RenderBody()
が呼び出されたときに表示されるものです (私の 2 番目のビューも同じレイアウト ファイルでこのように動作します)。
@model IEnumerable<CommandCenterEntity>
@{
if (Request.Browser.IsMobileDevice) {
Layout = "~/Views/Shared/_LayoutMobileContent.cshtml";
}
else {
Layout = "~/Views/Shared/_LayoutDesktop.cshtml";
}
}
<ul data-role="listview" id="commandcenterlist" data-filter="true" data-inset="true" data-theme="b">
@foreach (var entity in Model)
{
<li>
@Html.CommandCenterLinks(@entity, x => Url.Action("Index", "Worksheet", new { ParentId = @entity.ID_Item }))
</li>
}
</ul>
CommandCenterLinks ヘルパーは、エンティティのいくつかのプロパティに応じて異なるアイコンを含む "a" タグを生成するだけです。
画面の左側の div タグにあるリスト内のリンクをクリックすると、生成されたコンテンツが右側の別の div タグに表示されるように、ビューを組み合わせたいと思います。
モバイル レイアウトで使用されているのと同じアクション/コントローラーを再利用できることを望んでいたので、jQuery を使用してリストのクリック イベントをインターセプトし、アクションから返されたデータをキャプチャして、div に挿入しようとしました。
$(document).on("click", "#commandcenterlist a", function (e) {
$.mobile.showPageLoadingMsg();
$.ajax({
url: this.href,
success: function (data) {
$.mobile.hidePageLoadingMsg();
$("#desktopContentPane").html(data);
}
});
return false;
});
ただし、ajax 成功ハンドラーで返されるデータには、完全な html ページが含まれています。
<!DOCTYPE html>
<html>
<head>...</head>
<body>...</body>
</html>
...必要なのは、レイアウトの@RenderBody()
呼び出しで生成されたコンテンツだけです。コントローラーのメソッドを havereturn PartialView("Index");
に変更してみましたが、同じ結果になりました。ビューのその部分だけを取り戻す方法はありますか? または、これを行うためのよりクリーンで「MVC」な方法はありますか?