2016-08-29 9 views
1

こんにちは私はリンクボタンが1つあります。リンクボタンをクリックするとレコード数が表示されます。私はそのページングを適用したい。私は以下のように試みました。viewmodelとactionlinkを使用しているときにmvc4でページングを適用できません

Index.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); 
} 

これは、私はアクションメソッドをdetailsbyclientidするのClientIDを送っています私のviewcode

@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> 
} 

私のviewmodel

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

です。 actionlinkからclientidcurrentfilterとして送信するにはどうすればよいですか?現在のフィルタを送信していないため、現在nullのエラーが発生しています。私がどこにいても間違っているかどうか教えてください。ありがとうございました

+1

なぜ、 'Index'ビューのリンクに' currentFilter'の値を送る必要がありますか?まだ何かをフィルタリングしています)。パラメータ 'int? currentFilter'ので、そのヌルかどうかをテストすることができます。 –

+0

はい、コントロールはアクションメソッド内に入り、トレースできます。しかし、私はModel.detailsbyclientId.Count()== 0.でエラーが発生しているビューで私は私のviewmodelの変更を加える必要がありますか? –

+0

ビュー内のあなたのモデルは 'detailsbyclientId'という名前のプロパティを持たない' IPagedList 'ですので、' Model.detailsbyclientId.Count() 'は例外をスローします。しかし、コントローラのコードは 'detailsbyclientIdviewModel'モデルを返すので意味がありません。 –

答えて

0

currentFilterからint?(nullable)のパラメータを変更して、nullかどうかをテストしてください。また、あなただけでリンクすることができます

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

しかし、例外をスローするコードには複数の他のエラーがあります。

まず、モデル、あなたがビューに戻るため、ビュー内のモデルが

@model yourAssembly.detailsbyclientIdviewModel 

次と一致する必要があり、typeof演算detailsbyclientIdviewModelで、あなたが財産detailsbyclientIdにPagedListを割り当てているので、あなたがモデルを変更する必要があります

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 upldIdまたはIEnumerable<Metadata> metadataを使用することはありませんときにビューにdetailsbyclientIdviewModelモデルを渡します。あなたのビューとコントローラに元のコードをそのまま残すことができます

IPagedList<detailsbyClientId> pagedLog = detailsbyclient.ToPagedList(pageNumber, pageSize); 
return View("detailsbyClientId", pagedLog); 
関連する問題