gpt4 book ai didi

c# - 使用 ModelBinder 属性与 ModelBinders.Add()

转载 作者:IT王子 更新时间:2023-10-29 04:30:42 28 4
gpt4 key购买 nike

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

我能想到的一个优点是它更明确,而在全局 ModelBinders 中注册对于检查操作方法的人来说并不那么明显。

我能想到的一个权衡是它不可重用,因为您必须将此属性添加到需要使用此模型绑定(bind)器的所有操作方法,而在全局 ModelBinders 中注册将使它可用于接收该模型的所有操作方法。

这是唯一的区别吗?

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

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

最佳答案

这些技术的结果是一样的,所以这主要取决于团队对什么感觉更满意。所以你可以想出一个像你所说的那样的约定。

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

  • 像这样设置模型类的属性:

    [ModelBinder(typeof(MyModelBinder))]
    public class MyModel
    {
    ...
    }
  • 全局注册binder

    ModelBinders.Binders.Add(typeof(MyModel), new MyModelBinder())

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

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())

...
}

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

ModelBinderProviders.BinderProviders.Add(new CustomModelBinderProvider()) 

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

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

  1. Action 参数的属性。请参阅 ControllerActionInvoker class 的 GetParameterValue 方法

  2. 从 IModelBinderProvider 返回的 Binder。请参阅 ModelBinderDictionary class 中的 GetBinder 方法

  3. 在 ModelBinders.Binders 字典中全局注册的 Binder。

  4. 模型类型的 [ModelBinder()] 属性中定义的 Binder。

  5. DefaultModelBinder。

关于c# - 使用 ModelBinder 属性与 ModelBinders.Add(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13746472/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com