Asp.net mvc 4 在使用pushstate进行部分视图分页时优雅地处理永久链接

Asp.net mvc 4 在使用pushstate进行部分视图分页时优雅地处理永久链接,asp.net-mvc-4,partial-views,permalinks,pushstate,Asp.net Mvc 4,Partial Views,Permalinks,Pushstate,当我的应用程序使用pushstate加载ASP.NET MVC部分视图进行分页时,我正在寻找一种干净的方法来处理永久链接 如果我的控制器返回部分视图(当前),则永久链接将单独显示部分视图,而不显示由_Layout.cshtml定义的站点的其余部分 如果我的控制器返回一个常规视图,permalink可以工作,但是将整个页面加载到只为部分页面提供的容器中会产生一种Droste效果 我找到的唯一解决方案是将404重定向到主页,并使用url的相关部分导航到正确的页面 但是,这会阻止我使用自定义错误页面(

当我的应用程序使用pushstate加载ASP.NET MVC部分视图进行分页时,我正在寻找一种干净的方法来处理永久链接

如果我的控制器返回部分视图(当前),则永久链接将单独显示部分视图,而不显示由_Layout.cshtml定义的站点的其余部分

如果我的控制器返回一个常规视图,permalink可以工作,但是将整个页面加载到只为部分页面提供的容器中会产生一种Droste效果

我找到的唯一解决方案是将404重定向到主页,并使用url的相关部分导航到正确的页面


但是,这会阻止我使用自定义错误页面(这恰好是一个非常棒的错误页面)。

好的,我知道如何使用双控制器设置来实现这一点

NavigationController处理ajax调用并返回部分视图(注意没有“索引”)

单独的PermalinkController通过返回整个常规视图来处理permalinks(注意,它有一个“索引”,但没有“主视图”:

路线:

       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/\u Layout.cshtml:

...
<header></header>
<div id="pageViewContainer">
    @RenderBody()
</div>        
<footer></footer>
...
       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 { }
        );
...
<header></header>
<div id="pageViewContainer">
    @RenderBody()
</div>        
<footer></footer>
...
<div> Home Content </div>
@{
    ViewBag.Title = "Index";
    Layout = "~/Views/Shared/_Layout.cshtml";
 }

 @Html.Partial("~/Views/Navigation/Home.cshtml", null)