根据:MVC3 Model binding pagedlist to ViewModel with custom EditorTemplate and Partial View
请参阅上面的代码段问题
我现在遇到的问题是围绕绑定自定义IPagedList集合。模型绑定器尝试将值绑定到ViewModel上的属性,但无法创建接口的实例(不会在那里出现)。
那么如何在绑定值时通过实例化具体的PagedList类将值绑定回我的viewModel?据我所知,IEnumerable绑定器为List或类似派生做了这个,所以我怎么能为我的自定义类/接口做这个?
我需要一个自定义模型粘合剂吗?如果有任何信息或代码提示很好!
非常感谢任何帮助。
更新
更改ViewModel以包含一个覆盖默认构造函数,该构造函数初始化接口,如下所示:
public class RequestCreateViewModel : ViewModelBase
{
public IPagedList<CreateRequestModel> PagedList { get; set; }
public RequestCreateVieWModel()
{
PagedList = new PagedList<RequestCreateModel>(new List<RequestCreateModel>(), new PagingOptions());
}
..似乎允许默认模型绑定器按照我的评论工作。但它似乎不是一个很好的解决方案,主要是因为我需要在每次创建ViewModel时为PagedList对象推断新的对象参数。我不必担心吗?
答案 0 :(得分:1)
查看Codeplex上ASP.NET MVC项目中DefaultModelBinder.cs
的来源。 BindComplexModel
中的评论总结了一切:
// special-case IDictionary<,> and ICollection<>
如果MVC框架特殊情况下那些类型,那么您将需要为您的类型创建自定义模型绑定器。但是你提供的解决方案有效......为什么?您的类型未实现ICollection
或IDictionary
特殊情况。默认代码路径调用模型类型的默认构造函数:
// fallback to the type's default constructor
return Activator.CreateInstance(typeToCreate);
您的默认构造函数会创建您需要的类型。因此,没有错误。没有默认构造函数,没有对象实例,正如您所指出的那样,您会收到错误。
你问了更多的想法。离开你拥有的东西怎么样有用。在这一点上编写自定义模型绑定器只会更加有效。更多代码可以完成同样的事情。