あなたは正しい軌道に乗っています。ページを更新せずに HTML をレンダリングするには、ajax を使用する必要があります。また、現在のタブを含むように URL を更新するには、プッシュ状態を使用する必要があります。
これらを個別の操作として実行することもできますが、PJAXを使用することをお勧めします。PJAX を使用すると、レイアウトを含む完全な html ページを返すか、部分的なもの (PJAX 要求) を返すかを決定するために、サーバーに少し追加のロジックが必要になります。
これが Foo コントローラーです。インデックスには、デフォルトで選択された「バー」タブがあります。Bar アクションと Baz アクションは Index ビューを返しますが、別のタブが選択されたタブになっています。PJAX リクエストの場合、必要なのはタブのコンテンツを埋める部分ビューだけです。
public class FooController : Controller
{
public ActionResult Index()
{
ViewBag.SelectedTab = "Bar";
return View();
}
public ActionResult Bar()
{
if(Request.Headers["X-PJAX"] != null)
return PartialView();
ViewBag.SelectedTab = "Bar";
return View("Index");
}
public ActionResult Baz()
{
if (Request.Headers["X-PJAX"] != null)
return PartialView();
ViewBag.SelectedTab = "Baz";
return View("Index");
}
}
Foo/Index.cshtml の内部には、レンダリングする部分ビューを決定する Razor コードがありますViewBag.SelectedTab
。
@{
ViewBag.Title = "Foo";
}
<h2>Foo</h2>
<ul>
<li><a class="tabs" href="@Url.Action("Bar", "Foo")">Bar</a></li>
<li><a class="tabs" href="@Url.Action("Baz", "Foo")">Baz</a></li>
</ul>
<div id="tab_content">
@if(ViewBag.SelectedTab == "Bar")
{
@Html.Partial("Bar")
}
@if (ViewBag.SelectedTab == "Baz")
{
@Html.Partial("Baz")
}
</div>
@section scripts
{
<script type="text/javascript">
$(function() {
$(".tabs").pjax("#tab_content");
})
</script>
}
最後のスクリプト セクションは、PJAX を接続する方法です。クラスとのすべてのハイパーリンクはtabs
pjax を使用して、 から生成された htmlhref
を idtab_content
を持つコンテナーに動的にロードしてレンダリングし、ブラウザーの URL を からの URL に更新しhref
ます。
このシナリオでは、各タブの部分ビューはかなり単純です
Bar.cshtml
<p>This is the Bar tab. No pun intended.</p>
Baz.cshtml
<p>This is the baz tab.</p>
これは明らかに非常に単純化されたソリューションです。通常、プレゼンテーション モデルを使用してビューのロジックを処理します。また、この手法があらゆる種類のリンクで使用できることを示すために、意図的にタブ スタイルを省略しています。タブだけに限定されません。
この例の完全なソース コードは、私の GitHub サイトにあります。