MVC发布IPagedList

时间:2013-01-10 12:41:44

标签: asp.net-mvc checkbox pagedlist

我有以下PagedListModel:

public class PagedClientViewModel
{
    public int? Page { get; set; }
    public PagedList.IPagedList<ClientViewModel> Clients { get; set; }               
}

public class ClientViewModel
{        
    public string ClientNumber { get; set; }
    public bool UseThisClient{ get; set; }
}

我的观点如下:

@using (Html.BeginForm("Index", "Home", FormMethod.Get, new { id = "Form" }))
{
    @foreach (var item in Model.Clients)
    {
       @Html.DisplayFor(modelItem => item.ClientNumber)
       @Html.CheckBoxFor(modelItem => item.UseThisClient)
    }    

 @Html.HiddenFor(model => model.Clients)            
}

控制器操作:

 public ActionResult Index(PagedClientViewModel model)
 {
  //...process all clients in the list
 }

我想将模型发布回控制器,以便我可以处理已勾选的复选框,但是我收到以下错误:我有点明白错误是因为我回发了一个界面但我不能找到解决办法。我怎样才能完成这项工作?

  

无法创建接口的实例。在   System.RuntimeTypeHandle.CreateInstance(RuntimeType类型,布尔值   publicOnly,Boolean noCheck,Boolean&amp; canBeCached,   RuntimeMethodHandleInternal&安培; ctor,布尔&amp; bNeedSecurityCheck)at   System.RuntimeType.CreateInstanceSlow(Boolean publicOnly,Boolean   skipCheckThis,Boolean fillCache,StackCrawlMark&amp; stackMark)at   System.RuntimeType.CreateInstanceDefaultCtor(Boolean publicOnly,   Boolean skipCheckThis,Boolean fillCache,StackCrawlMark&amp; stackMark)
  在System.Activator.CreateInstance(Type type,Boolean nonPublic)
  在System.Activator.CreateInstance(Type type)at   System.Web.Mvc.DefaultModelBinder.CreateModel(ControllerContext   controllerContext,ModelBindingContext bindingContext,Type modelType)   在System.Web.Mvc.DefaultModelBinder.BindSimpleModel(ControllerContext)   controllerContext,ModelBindingContext bindingContext,   ValueProviderResult valueProviderResult)at   System.Web.Mvc.DefaultModelBinder.BindModel(ControllerContext   controllerContext,ModelBindingContext bindingContext)at   System.Web.Mvc.DefaultModelBinder.GetPropertyValue(ControllerContext   controllerContext,ModelBindingContext bindingContext,   PropertyDescriptor propertyDescriptor,IModelBinder propertyBinder)
  在System.Web.Mvc.DefaultModelBinder.BindProperty(ControllerContext   controllerContext,ModelBindingContext bindingContext,   PropertyDescriptor propertyDescriptor)at   System.Web.Mvc.DefaultModelBinder.BindProperties(ControllerContext   controllerContext,ModelBindingContext bindingContext)at   System.Web.Mvc.DefaultModelBinder.BindComplexElementalModel(ControllerContext   controllerContext,ModelBindingContext bindingContext,Object model)
  在   System.Web.Mvc.DefaultModelBinder.BindComplexModel(ControllerContext   controllerContext,ModelBindingContext bindingContext)at   System.Web.Mvc.DefaultModelBinder.BindModel(ControllerContext   controllerContext,ModelBindingContext bindingContext)at   System.Web.Mvc.ControllerActionInvoker.GetParameterValue(ControllerContext   controllerContext,ParameterDescriptor parameterDescriptor)at   System.Web.Mvc.ControllerActionInvoker.GetParameterValues(ControllerContext   controllerContext,ActionDescriptor actionDescriptor)at   System.Web.Mvc.Async.AsyncControllerActionInvoker&LT;&GT; C_ DisplayClass25.b _1e(的AsyncCallback   asyncCallback,Object asyncState)at   System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult 1.Begin(AsyncCallback callback, Object state, Int32 timeout) at System.Web.Mvc.Async.AsyncControllerActionInvoker.BeginInvokeAction(ControllerContext controllerContext, String actionName, AsyncCallback callback, Object state) at System.Web.Mvc.Controller.<>c__DisplayClass1d.<BeginExecuteCore>b__17(AsyncCallback asyncCallback, Object asyncState) at System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult 1.Begin(的AsyncCallback   回调,对象状态,Int32超时)at   System.Web.Mvc.Controller.BeginExecuteCore(AsyncCallback回调,   对象状态)   System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult 1.Begin(AsyncCallback callback, Object state, Int32 timeout) at System.Web.Mvc.Controller.BeginExecute(RequestContext requestContext, AsyncCallback callback, Object state) at System.Web.Mvc.Controller.System.Web.Mvc.Async.IAsyncController.BeginExecute(RequestContext requestContext, AsyncCallback callback, Object state) at System.Web.Mvc.MvcHandler.<>c__DisplayClass8.<BeginProcessRequest>b__2(AsyncCallback asyncCallback, Object asyncState) at System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult 1.Begin(的AsyncCallback   回调,对象状态,Int32超时)at   System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContextBase   httpContext,AsyncCallback回调,对象状态)at   System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContext httpContext,   AsyncCallback回调,对象状态)   System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.BeginProcessRequest(HttpContext的   context,AsyncCallback cb,Object extraData)at   System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()   在System.Web.HttpApplication.ExecuteStep(IExecutionStep步骤,   布尔和放大器; completedSynchronously)

1 个答案:

答案 0 :(得分:9)

解决此问题的方法是将分页元数据作为单独的属性传递,并在视图中重建IPagedList。如下所示

public class PagedClientViewModel
{
    public int? Page { get; set; }
    public List<ClientViewModel> Clients { get; set; }
    public IPagedList PagingMetaData { get; set; } 
}

创建元数据

pagedClientViewModel.PagingMetaData = new StaticPagedList<ClientViewModel>(pagedClientViewModel.Clients, pageIndex, pageSize, TotalClients).GetMetaData();

在视图中构建寻呼机

<div style="text-align: center">
    @Html.PagedListPager(new StaticPagedList<ClientViewModel>(Model.Clients, Model.PagingMetaData), page => Url.Action("<actionname>", new { page }), PagedListRenderOptions.Classic)
</div>