1

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

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

如果我的控制器返回常规视图,则永久链接有效,但将整个页面加载到仅为部分页面提供的容器中会创建一种 Droste 效果。

我发现的唯一解决方案是将 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 部分视图:

<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 回答