首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用ModelBinder属性与ModelBinders.Add()

使用ModelBinder属性与ModelBinders.Add()
EN

Stack Overflow用户
提问于 2012-12-06 15:06:15
回答 2查看 16.6K关注 0票数 25

有人能告诉我使用[ModelBinder()]属性与通过ModelBinders.Add()在global.asax中注册模型绑定的利弊吗?

我能想到的一个优点是,它更显着,而在全局ModelBinders中注册并不像检查操作方法的人那样容易。

我可以想到的一个折衷之处是,它是不可重用的,因为您必须将该属性添加到所有需要使用该模型绑定的操作方法中,而在全局ModelBinders中注册将使其可供接收该模型的所有操作方法使用。

这是唯一的区别吗?

换句话说,这样说是正确的吗?

  • 如果您只在一个动作方法(可能是两个,get + post)中使用该模型,则使用[ModelBinder()]
  • 如果在多个操作方法中使用该模型,则将其注册到全局ModelBinders中。
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-12-06 17:27:08

这些技术的结果将是一样的,所以这主要取决于球队对什么感觉更舒服。所以你可以像你说的那样想出一个会议。

就我个人而言,我不喜欢在使用该模型的每个操作方法上设置属性。因此,我将选择以下选项之一:

  • 在模型类上设置属性,如: ModelBinder(MyModelBinder)公共类MyModel {.}
  • 全局注册活页夹 ModelBinders.Binders.Add(类型(MyModel),新MyModelBinder())

我喜欢其中之一的另一个原因是,如果您必须手动触发模型绑定过程,您可能还希望使用您的自定义模型绑定:

代码语言:javascript
复制
public ActionResult SomeActionMethod()
{
     MyModel model = ...

     //manually invoke the model binding process considering only query string data
     //The custom model binder will be used only if it was globally registered
     //in the binders dictionary or set in an attribute of the model class
     TryUpdateModel(model, new QueryStringValueProvider())

     ...
}

您还可以通过实现接口IModelBinderProvider并在global.asax中注册,来实现自己的选择模型绑定的逻辑,如

代码语言:javascript
复制
ModelBinderProviders.BinderProviders.Add(new CustomModelBinderProvider()) 

在方法参数中使用属性的一种方法可能是重写该特定方法(否则将使用的模型绑定)。这样,您就可以为类全局注册一个模型绑定器,并使用该属性在一个特定的操作方法中重写它。

最后,有相当多的选择模式粘合剂的选择。在asp MVC 3中,这将通过以下方式解决(假设您使用的是默认的ControllerActionInvoker)

  1. 动作参数的属性。参见GetParameterValue方法的ControllerActionInvoker类
  2. 装订者从IModelBinderProvider回来。参见GetBinder方法中的ModelBinderDictionary类
  3. 在ModelBinders.Binders字典中注册的绑定器。
  4. 模型类型的[ModelBinder()]属性中定义的绑定器。
  5. DefaultModelBinder。
票数 33
EN

Stack Overflow用户

发布于 2014-09-09 15:46:27

在我看来,使用属性而不是添加到Global.asax中的模型绑定集合的优点是,您可以告诉方法(或类)使用哪个特定的绑定器,而不是将绑定与特定类型关联起来。然后,您可以根据上下文而不是类型创建模型。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13746472

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档