1

アプリケーションがpushstateを使用してページネーションのためにASP.NETMVC部分ビューをロードするときにパーマリンクを処理するクリーンな方法を探しています

私のコントローラーが(現在)部分ビューを返す場合、パーマリンクは_Layout.cshtmlで定義されたサイトの残りの部分なしで部分ビューのみを表示します。

コントローラが通常のビューを返す場合、パーマリンクは機能しますが、ページ全体をページの一部にのみ提供されるコンテナにロードすると、一種のドロステ効果が作成されます。

私が見つけた唯一の解決策は、404をホームページにリダイレクトし、URLの関連部分を使用して正しいページに移動することです。

ただし、これにより、カスタムエラーページを使用できなくなります(これはたまたま素晴らしいエラーページです)。

4

1 に答える 1

0

わかりました。ダブルコントローラーのセットアップでこれを機能させる方法を見つけました。

NavigationControllerはajax呼び出しを処理し、部分的なビューを返します(「インデックス」がないことに注意してください)

public class NavigationController : Controller
{
    public PartialViewResult Home()
    {
        return PartialView("Home", null);
    }

    public PartialViewResult About()
    {
        return PartialView("About", null);
    }

    ...
 }

個別のPermalinkControllerは、通常のビュー全体を返すことによってパーマリンクを処理します(これには「インデックス」がありますが「ホーム」はないことに注意してください:

public class PermalinkController : Controller
{
    public ActionResult Index()
    {
        return View();
    }

    public ActionResult About()
    {
        return View();
    }

    ...
}

ルート:

       routes.MapRoute(
            "PermalinkRouter",
            "{action}",
            new { controller = "Permalink", action = "Index" },
            new { }
        );

        routes.MapRoute(
            "NavigationRouter",
            "Navigation/{action}/{id}",
            new { controller = "Navigation", action = "Home", id = UrlParameter.Optional },
            new { }
        );

ビュー:

〜/ Views / Shared / _Layout.cshtml:

...
<header></header>
<div id="pageViewContainer">
    @RenderBody()
</div>        
<footer></footer>
...

〜/ Views / Navigation / Home.cshtml PartialView:

<div> Home Content </div>

〜/ Views / Permalink / Index.cshtmlビュー:

@{
    ViewBag.Title = "Index";
    Layout = "~/Views/Shared/_Layout.cshtml";
 }

 @Html.Partial("~/Views/Navigation/Home.cshtml", null)
于 2012-12-09T19:17:01.833 に答える