【发布时间】:2010-03-04 03:48:21
【问题描述】:
我有一个类型:
public class IssueForm
{
Order Order {get; set;}
Item Item {get; set;}
Range Range {get; set;}
}
由于对订单和项目的要求,我创建了一个自定义模型绑定器,但 Range 仍然可以使用默认模型绑定器。
我的自定义模型绑定器中是否有一种方法可以调用默认模型绑定器以返回 Range 对象?我想我只需要正确设置 ModelBindingContext,但我不知道如何。
编辑
查看第一条评论和答案——似乎从默认模型绑定器继承可能很有用。
到目前为止,要为我的设置添加更多细节:
public IssueFormModelBinder : IModelBinder
{
public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
Order = //code to pull the OrderNumber from the context and create an Order
Item = //code to pull the ItemNumber from the context and create an Item
IssueForm form = IssueFormFactory.Create(Order, Item);
form.Range = // ** I'd like to replace my code with a call to the default binder **
return form
}
}
这可能是一种愚蠢的做法……这是我的第一个模型活页夹。只是指出我当前的实现。
编辑#2
因此,如果我可以像“我已经完成绑定”方法一样挂钩并使用属性调用 Factory 方法,那么覆盖 BindProperty 的答案将起作用。
我想我真的应该看看 DefaultModelBinder 的实现,别再傻了。
【问题讨论】:
-
我不确定这是否是最优雅的解决方案,但您能否从 DefaultModelBinder 派生自定义模型绑定器而不是实现 IModelBinder?然后,当您覆盖 BindModel 时,在适当的地方将责任传递给 DefaultModelBinder。否则,使用自定义绑定。
-
是的,我看到一些模型绑定器脱离了 IModelBinder 和 DefaultModelBinder。我猜 DefaultModelBinder 有一些额外的方法,我假设它是从 BindModel 方法调用的,所以您可以更加关注您的需求?
-
它只是证实了我决定忽略 ModelBinder 和手动代码输入处理和验证。现在,我拥有一致、透明且可调整的内容,以满足当前和可想象的未来需求。