0

我需要帮助。我正在使用 MVC 4 做一个简单的博客。

Edit3:总的来说,概念如下:左侧是带有类别的导航栏,右侧是带有ajax分页的帖子。当您单击具体帖子时,我们会转到包含帖子详细信息的页面。

我有一个布局:

<body>
    <div class="container-fluid">
        <div class="row-fluid">
            <div class="sidebar-nav-fixed fill">
                @Html.Action("GetCategories","Navigation")
            </div>
            <div class="sidebar-nav-fixed-stuck-left fill white">
                <div class="container-fluid">
                    <div class="row-fluid">
                        <div class="span12">
                            <div class="content-area">
                                @RenderBody()
                            </div>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</body>

我从带有分页的帖子控制器列表返回。Pager 创建到控制器的 ajax 链接:

<a data-ajax=\"true\" data-ajax-method=\"GET\" data-ajax-mode=\"replace\" href=\"{0}\" data-page=\"{1}\">{2}</a>

如果我返回一个没有布局的部分视图,它只呈现部分视图,但 ajax 分页有效。如果我返回带有布局的部分视图,它会完美呈现,ajax 查询有效,控制器返回部分视图,但分页不起作用。

看法

@model PagingListViewModel<PostViewModel>

@*@{
    Layout = "~/Views/Shared/_Layout.cshtml";
}*@

@foreach (var post in Model.Items)
{
    @Html.DisplayFor(_ => post,"Post")
}

@Html.DisplayFor(x => x.PageInfo)

编辑:我使用自定义寻呼机。如果标志“isAjax”为真,它会生成 ajax 链接。这是一种为每个页面生成链接的方法

private string GeneratePageLink(string linkText, int pageNumber)
        {
            var pageLinkValueDictionary = new RouteValueDictionary(linkWithoutPageValuesDictionary);
            pageLinkValueDictionary[Page] = pageNumber;

            var contextQueryString = requestContext.HttpContext.Request.QueryString;
            foreach (string queryStrings in contextQueryString)
            {
                if (queryStrings.Equals(Page, StringComparison.OrdinalIgnoreCase) ||
                    pageLinkValueDictionary.ContainsKey(queryStrings))
                    continue;

                pageLinkValueDictionary.Add(queryStrings, contextQueryString[queryStrings]);
            }

            var virtualPath = RouteTable.Routes.GetVirtualPath(requestContext, pageLinkValueDictionary) == null
                                  ? string.Empty
                                  : RouteTable.Routes.GetVirtualPath(requestContext, pageLinkValueDictionary)
                                              .VirtualPath;

            return string.Format(
                isAjax
                    ? "<li><a data-ajax=\"true\" data-ajax-method=\"GET\" data-ajax-mode=\"replace\" href=\"{0}\" data-page=\"{1}\">{2}</a></li>"
                    : "<li><a href=\"{0}\" data-page=\"{1}\">{2}</a></li>",
                virtualPath, pageNumber, linkText
                );
        }

编辑2:

[HttpGet]
public ActionResult Posts(int? page)
{
... query to database
return AjaxPagingList<Post, PostViewModel>(posts, "PostsList")
}

 protected ActionResult AjaxPagingList<TItem, TModel>(IEnumerable<TItem> itemsObjects, string view)
            where TItem : class, where TModel: class
        {
            var items = AutoMappingProvider.MapToList<TItem>(itemsObjects);

            var catalogViewModel = new PagingListViewModel<TModel>
            {
               ....
            }

            return PartialView(view, catalogViewModel);
        }
4

1 回答 1

0

我解决了我的问题。我改变了部分观点:

@model PagingListViewModel<PostViewModel>

@{
    Layout = Request.IsAjaxRequest() ? null : "~/Views/Shared/_Layout.cshtml";
}

@foreach (var post in Model.Items)
{
    @Html.DisplayFor(_ => post,"Post")
}

@Html.DisplayFor(x => x.PageInfo)

并将属性添加到链接 data-ajax-update="..."。

于 2013-08-17T11:12:46.963 回答