Asp.net mvc Ajax分页mvc4

Asp.net mvc Ajax分页mvc4,asp.net-mvc,asp.net-mvc-3,asp.net-mvc-4,pagination,Asp.net Mvc,Asp.net Mvc 3,Asp.net Mvc 4,Pagination,我需要帮助。 我正在用MVC4做一个简单的博客 Edit3:一般来说,概念如下:左侧是带有类别的导航栏,右侧是带有ajax分页的帖子。当你点击具体的帖子时,我们会转到包含帖子详细信息的页面 我有一个布局: <body> <div class="container-fluid"> <div class="row-fluid"> <div class="sidebar-nav-fixed fill">

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

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>

@Html.Action(“GetCategories”、“Navigation”)
@RenderBody()
我从控制器返回带有分页的帖子列表。寻呼机创建指向控制器的ajax链接:

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

如果我返回一个没有布局的局部视图,它只呈现为局部视图,但是ajax分页可以工作。若我返回一个带有布局的局部视图,它会被完美地呈现出来,ajax查询工作,控制器返回局部视图,但分页不工作

看法

@model PagingListViewModel
@*@{
Layout=“~/Views/Shared/_Layout.cshtml”;
}*@
@foreach(模型项中的var post)
{
@DisplayFor(=>post,“post”)
}
@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
                );
        }
private string generatePage链接(字符串链接文本,int页码)
{
var pageLinkValueDictionary=新的RouteValueDictionary(linkWithoutPageValuesDictionary);
pageLinkValueDictionary[页码]=页码;
var contextQueryString=requestContext.HttpContext.Request.QueryString;
foreach(contextQueryString中的字符串QueryString)
{
if(querystring.Equals(第页,StringComparison.OrdinalIgnoreCase)||
pageLinkValueDictionary.ContainsKey(查询字符串))
继续;
pageLinkValueDictionary.Add(querystring,contextQueryString[querystring]);
}
var virtualPath=RouteTable.Routes.GetVirtualPath(requestContext,pageLinkValueDictionary)==null
?字符串。空
:RouteTable.Routes.GetVirtualPath(requestContext,pageLinkValueDictionary)
.虚拟路径;
返回字符串格式(
伊萨克斯
“
  • ” :“
  • ”, 虚拟路径、页码、链接文本 ); }
    编辑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);
            }
    
    [HttpGet]
    公共行动结果帖子(int?第页)
    {
    …对数据库的查询
    返回AjaxPagingList(posts,“PostsList”)
    }
    受保护的ActionResult AjaxPagingList(IEnumerable ItemsObject,字符串视图)
    其中TItem:class,其中TModel:class
    {
    var items=AutoMappingProvider.MapToList(itemsObjects);
    var catalogViewModel=新分页列表视图模型
    {
    ....
    }
    返回PartialView(视图、目录视图模型);
    }
    
    我解决了我的问题。我改变了部分观点:

    @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)
    
    @model PagingListViewModel
    @{
    Layout=Request.IsAjaxRequest()?空:“~/Views/Shared/_Layout.cshtml”;
    }
    @foreach(模型项中的var post)
    {
    @DisplayFor(=>post,“post”)
    }
    @DisplayFor(x=>x.PageInfo)
    

    并将属性添加到链接数据ajax update=“…”中

    我有点困惑。您是否返回初始页面请求的完整视图和ajax寻呼机请求的部分视图?能否显示处理ajax帖子的相关javascript?我使用自定义寻呼机。如果标志“isAjax”为true,它将生成ajax链接。控制器方法的第一个调用不是ajax,其他调用是通过链接形成的ajax页面。我做错了什么?您是否也可以显示正在处理这些请求的控制器操作?
    @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)