【问题标题】:MVC3 Binding a custom CollectionMVC3 绑定自定义集合
【发布时间】:2012-01-06 17:50:12
【问题描述】:

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

代码 sn-ps 见上述问题

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

那么,当绑定值时,如何通过实例化一个具体的 PagedList 类将值绑定回我的 viewModel?据我了解,IEnumerable binder 为 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 对象推断新的对象参数。我是否有不必要的担心?

【问题讨论】:

  • 我会研究自定义模型绑定器。一开始很吓人,但也不算太糟糕。您可以使用此功能做很多事情。请记住,有两种不同的方法可以做到这一点。从 DefaultModelBinder 继承并创建您自己的简单实现 IModelBinder 的绑定器。
  • 有人知道杰夫所说的更多信息吗?谢谢
  • 已经为 ViewModel 对象添加了一个构造函数并初始化了接口,默认绑定器完成了它的工作并使用正确的命名进行绑定。灵感来自:stackoverflow.com/questions/5749775/… 但它确实避免了为此创建自定义模型绑定器......所以我的问题仍然是这是否是一个好主意?
  • 没有人有任何 cmets 或更好的解决方案?定制活页夹会更好吗?

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


【解决方案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);

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

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

【讨论】:

  • 同意,为响应欢呼我会将此标记为答案,因为我不会更改实现。干杯。
猜你喜欢
  • 2012-11-09
  • 1970-01-01
  • 1970-01-01
  • 2012-07-10
  • 1970-01-01
  • 2013-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多