【问题标题】:Unable to apply paging in mvc4 when using viewmodel and actionlink使用 viewmodel 和 actionlink 时无法在 mvc4 中应用分页
【发布时间】:2016-08-29 11:04:05
【问题描述】:

您好,我有一个链接按钮。当我单击链接按钮时,将显示记录数。我想为此应用分页。我已经尝试如下。

索引.cshtml

@foreach (var group in Model.records)
{
    <tr>                    
        <td>@Html.ActionLink(@group.clientId.ToString(), "detailsbyClientId", "DocumentVerification", new { clientId = @group.clientId.ToString()},null)</td>
        <td>@group.clientName</td>
        <td>@group.Count</td>
    </tr>
}

这是我的控制器代码。

public ActionResult detailsbyClientId(int? clientId, int currentFilter, int? page)
{
    if (clientId != null)
    {
        page = 1;
    }
    else
    {
        clientId = currentFilter;
    }
    ViewBag.CurrentFilter = clientId;
    int pageSize = 8;
    int pageNumber = (page ?? 1);
    documentVerificationBAL objBAL = new documentVerificationBAL();
    int cId = Convert.ToInt32(clientId);
    List<detailsbyClientId> detailsbyclient = objBAL.detailsbyclient(cId);
    IPagedList<detailsbyClientId> pagedLog = detailsbyclient.ToPagedList(pageNumber, pageSize);

    detailsbyclientIdviewModel model;
    model = new detailsbyclientIdviewModel()
    {
        detailsbyclientId = pagedLog
    };
    return View("detailsbyClientId", model);
}

这是我的视图代码

@model  PagedList.IPagedList<c3card.DAL.detailsbyclientIdviewModel>
@using PagedList.Mvc;
@if(!Model.detailsbyclientId.Any())
{
<div>
    <table width="100%" border="0" cellspacing="0" cellpadding="0" class="dataTable tableHover">
        <tr>
            <th>Corporate Name</th>
            <th>employee ID</th>
            <th>employee Name</th>
            <th>Nationality</th>
            <th>Document Type</th>
            <th>Actions</th>
        </tr>
        @foreach (var group in Model.detailsbyclientId)
        {
            <tr>
                <td> @group.clientName </td>
                <td> @group.employeeId </td>
                <td> @group.employeeName </td>
                <td> @group.documentType </td>
                <td scope="col">
                    <input type="button" class="btn btn-primary btn-cons" value="View Document" onclick="showDocumentData('@group.upld_Id');" />
                </td>
                <td scope="col">
                    < input type="button" class="btn btn-primary btn-cons" value="Approve" onclick="showDocumentData('@group.upld_Id');" />
                </td>
                <td scope="col">
                    < input type="button" class="btn btn-primary btn-cons" value="Reject" onclick="showDocumentData('@group.upld_Id');" />
                </td>
            </tr>
        }
    </table>

    @Html.PagedListPager(Model, page => Url.Action("detailsbyClientId",
    new { page, currentFilter = ViewBag.CurrentFilter, pageSize = 5 }))
    Page @(Model.PageCount < Model.PageNumber ? 0 : Model.PageNumber) of @Model.PageCount
</div>
}

我的视图模型

public class detailsbyclientIdviewModel
    {
        public int upldId { get; set; }
        public IEnumerable<detailsbyClientId> detailsbyclientId { get; set; }
        public IEnumerable<Metadata> metadata { get; set; }
    }

我正在通过clientid 操作方法将clientid 发送到详细信息。如何从 actionlink 以currentfilter 的形式发送clientid?我目前收到可为空的错误,因为我没有发送当前过滤器。如果我在任何地方错了,请告诉我。非常感谢

【问题讨论】:

  • 为什么你需要在Index 视图的链接中为currentFilter 发送一个值(这没有意义,因为你还没有过滤任何东西)。只需设置参数int? currentFilter,这样您就可以测试它是否为null
  • 是的,现在控制进入动作方法,我可以追踪。但是在视图中我在 Model.detailsbyclientId.Count() == 0 中遇到错误。我需要在我的视图模型中进行任何更改吗?
  • 您在视图中的模型是IPagedList&lt;c3card.DAL.detailsbyclientIdviewModel&gt;,它不包含名为detailsbyclientId 的属性,因此Model.detailsbyclientId.Count() 会抛出异常。但是您的控制器代码也没有意义,因为您返回了 detailsbyclientIdviewModel 模型。
  • 视图中的模型为@model detailsbyclientIdviewModel,代码为@Html.PagedListPager(Model.detailsbyclientId, ... )。并且没有理由测试null,因为它永远不会是null - 它可以只是@if (!Model.detailsbyclientId.Any()) { &lt;div style="width: 100%; ... &gt;... &lt;/div&gt; } else { .... }
  • 先生,我该如何解决这个问题?

标签: c# asp.net-mvc asp.net-mvc-4 pagedlist


【解决方案1】:

currentFilter 的参数更改为int?(可为空),然后您可以测试它是否为null。也不是你链接可以只是

<td>@Html.ActionLink(group.clientId.ToString(), "detailsbyClientId", "DocumentVerification", new { clientId = group.clientId },null)</td>

但是,您的代码中还有多个其他错误会引发异常。

首先,你返回view的model是typeofdetailsbyclientIdviewModel,所以view中的model必须匹配

@model yourAssembly.detailsbyclientIdviewModel

接下来,您将 PagedList 分配给属性 detailsbyclientId,因此您需要将模型更改为

public class detailsbyclientIdviewModel
{
    ....
    public IPagedList<detailsbyClientId> detailsbyclientId { get; set; }
}

以便@Html.PagedListPager() 方法可以使用它。

最后,您需要在分页器方法中引用该属性

@Html.PagedListPager(Model.detailsbyclientId, page => Url.Action("detailsbyClientId",
    new { page, currentFilter = ViewBag.CurrentFilter, pageSize = 5 }))
Page @(Model.detailsbyclientId.PageCount < Model.detailsbyclientId.PageNumber ? 0 : Model.PageNumber) of @Model.detailsbyclientId.PageCount

话虽如此,当您从不使用该模型的 int upldIdIEnumerable&lt;Metadata&gt; metadata 时,尚不清楚为什么要将 detailsbyclientIdviewModel 模型传递给视图。您可以将原始代码保留在您的视图和控制器中

IPagedList<detailsbyClientId> pagedLog = detailsbyclient.ToPagedList(pageNumber, pageSize);
return View("detailsbyClientId", pagedLog );

【讨论】:

    猜你喜欢
    • 2013-06-24
    • 1970-01-01
    • 1970-01-01
    • 2013-09-08
    • 1970-01-01
    • 1970-01-01
    • 2014-01-06
    • 1970-01-01
    • 2012-09-20
    相关资源
    最近更新 更多