【问题标题】:MVC posting IPagedListMVC 发布 IPagedList
【发布时间】:2012-12-24 20:34:49
【问题描述】:

我有以下 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& canBeCached, RuntimeMethodHandleInternal& ctor, Boolean& bNeedSecurityCheck) 在 System.RuntimeType.CreateInstanceSlow(布尔 publicOnly,布尔 skipCheckThis、布尔填充缓存、StackCrawlMark 和 stackMark)在 System.RuntimeType.CreateInstanceDefaultCtor(布尔 publicOnly, Boolean skipCheckThis、Boolean fillCache、StackCrawlMark& stackMark)
在 System.Activator.CreateInstance(类型类型,布尔非公共)
在 System.Activator.CreateInstance(类型类型) System.Web.Mvc.DefaultModelBinder.CreateModel(ControllerContext 控制器上下文,模型绑定上下文绑定上下文,类型模型类型) 在 System.Web.Mvc.DefaultModelBinder.BindSimpleModel(ControllerContext 控制器上下文,模型绑定上下文绑定上下文, ValueProviderResult valueProviderResult) 在 System.Web.Mvc.DefaultModelBinder.BindModel(ControllerContext 控制器上下文,模型绑定上下文绑定上下文)在 System.Web.Mvc.DefaultModelBinder.GetPropertyValue(ControllerContext 控制器上下文,模型绑定上下文绑定上下文, PropertyDescriptor propertyDescriptor, IModelBinder propertyBinder)
在 System.Web.Mvc.DefaultModelBinder.BindProperty(ControllerContext 控制器上下文,模型绑定上下文绑定上下文, 属性描述符属性描述符)在 System.Web.Mvc.DefaultModelBinder.BindProperties(ControllerContext 控制器上下文,模型绑定上下文绑定上下文)在 System.Web.Mvc.DefaultModelBinder.BindComplexElementalModel(ControllerContext controllerContext, ModelBindingContext bindingContext, 对象模型)
在 System.Web.Mvc.DefaultModelBinder.BindComplexModel(ControllerContext 控制器上下文,模型绑定上下文绑定上下文)在 System.Web.Mvc.DefaultModelBinder.BindModel(ControllerContext 控制器上下文,模型绑定上下文绑定上下文)在 System.Web.Mvc.ControllerActionInvoker.GetParameterValue(ControllerContext 控制器上下文,参数描述符参数描述符)在 System.Web.Mvc.ControllerActionInvoker.GetParameterValues(ControllerContext 控制器上下文,动作描述符动作描述符)在 System.Web.Mvc.Async.AsyncControllerActionInvoker.c_DisplayClass25.b_1e(AsyncCallback asyncCallback,对象 asyncState) 在 System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult1.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.WrappedAsyncResult1.Begin(AsyncCallback 回调,对象状态,Int32 超时)在 System.Web.Mvc.Controller.BeginExecuteCore(AsyncCallback 回调, 对象状态)在 System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult1.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.WrappedAsyncResult1.Begin(AsyncCallback 回调,对象状态,Int32 超时)在 System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContextBase httpContext、AsyncCallback 回调、对象状态)在 System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContext httpContext, AsyncCallback 回调,对象状态)在 System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.BeginProcessRequest(HttpContext 上下文,AsyncCallback cb,对象 extraData)在 System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() 在 System.Web.HttpApplication.ExecuteStep(IExecutionStep 步骤, Boolean & completedSynchronously)

【问题讨论】:

  • 我过去在我的项目中使用过一些方法来解决这个问题。但是让我先问你这个问题 - 你必须发布和接口类型而不是具体的类类型吗?
  • 我想我必须发布接口类型,因为当我填充需要调用model.Clients = clients.ToPagedList(pageIndex, 25); 的客户端列表时,它会返回接口类型。我试图将IPagedList&lt;ClientViewModel&gt; 转换为PagedList&lt;ClientViewModel&gt;,但没有成功。

标签: asp.net-mvc checkbox pagedlist


【解决方案1】:

解决此问题的方法是将分页元数据作为单独的属性传递,并在视图中重建 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>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-04-04
    • 2016-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-18
    相关资源
    最近更新 更多