MVC3绑定自定义集合

时间:2012-01-06 17:50:13

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

根据: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对象推断新的对象参数。我不必担心吗?

1 个答案:

答案 0 :(得分:1)

查看Codeplex上ASP.NET MVC项目中DefaultModelBinder.cs的来源。 BindComplexModel中的评论总结了一切:

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

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

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

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

你问了更多的想法。离开你拥有的东西怎么样有用。在这一点上编写自定义模型绑定器只会更加有效。更多代码可以完成同样的事情。