c# - MVC3 绑定(bind)自定义集合

标签 c# asp.net-mvc asp.net-mvc-3 viewmodel model-binding

根据:MVC3 Model binding pagedlist to ViewModel with custom EditorTemplate and Partial View

查看上面的代码片段问题

我现在遇到的问题是绑定(bind)自定义 IPagedList 集合。模型绑定(bind)器尝试将值绑定(bind)到 ViewModel 上的属性,但无法创建接口(interface)的实例(这并不奇怪)。

那么如何在绑定(bind)值时通过实例化具体的 PagedList 类将值绑定(bind)回我的 viewModel?据我了解,IEnumerable Binder 为 List 或类似的衍生物执行此操作,那么我如何为我的自定义类/接口(interface)执行此操作?

我需要为此定制模型 Binder 吗?如果是这样,关于此的任何信息或代码提示都很棒!

非常感谢任何帮助。

更新:

更改 ViewModel 以包含一个重写的默认构造函数,它像这样初始化接口(interface):

public class RequestCreateViewModel : ViewModelBase
{
    public IPagedList<CreateRequestModel> PagedList { get; set; }

    public RequestCreateVieWModel()
    {
        PagedList = new PagedList<RequestCreateModel>(new List<RequestCreateModel>(), new PagingOptions());
    }

.. 似乎允许默认模型 Binder 按照我的评论工作。但这似乎不是一个很好的解决方案,主要是因为我需要在每次创建 ViewModel 时为 PagedList 对象推断新的对象参数。我是在不必要地担心吗?

最佳答案

Codeplex 上的 ASP.NET MVC 项目中查看 DefaultModelBinder.cs 的源代码. BindComplexModel 中的注释总结了这一切:

// special-case IDictionary<,> and ICollection<>

如果 MVC 框架对这些类型进行特殊处理,那么您将需要为您的类型创建自定义模型绑定(bind)器。但是您提供的解决方案有效……为什么?您的类型未实现 ICollectionIDictionary 特殊情况。默认代码路径调用模型类型的默认构造函数:

// fallback to the type's default constructor
return Activator.CreateInstance(typeToCreate);

您的默认构造函数创建您需要的类型。因此,没有错误。没有默认构造函数,没有对象实例,正如您所指出的,您会收到错误消息。

您要求提供更多想法。留下你所拥有的怎么样?有用。在这一点上编写自定义模型 Binder 只是需要更多的工作。更多代码来完成同样的事情。

关于c# - MVC3 绑定(bind)自定义集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8762148/

相关文章:

c# - Linq更新多列

c# - 无法将当前 JSON 对象反序列化为类型“WindowsService1...需要 JSON 数组(例如 [1,2,3])才能正确反序列化

c# - 根据定义的模式重新排序 XML 节点

asp.net-mvc - ASP.NET MVC 5 中未调用 Azure RoleEnvironment.Changing 事件

c# - 从 MVC4 中的 View 将 2 个不同模型传递给 Controller ​​的适当方法是什么

c# - Visual Studio Code Coverage 在 vNext 项目中过时了吗?

asp.net - MVC 3 ASPX VS RAZOR View 引擎

c# - 从 C# MVC Controller 加载 EXT JS 树面板

ASP.NET MVC 3 文件夹结构

asp.net表单例份验证多人使用同一用户名登录