1

我有一个看起来像的动作

public ActionResult GetUsers(List<int> userIds) {//do stuff}

userId 的列表可能会变得很长,所以我想使用 Json.Net 对其进行反序列化。为此,我创建了一个 IModelBinder 实现,它适用于其他对象,但永远不会被调用为 List。IModelBind 看起来像这样

public class JsonBinder : System.Web.Mvc.IModelBinder
{
  public object BindModel(System.Web.Mvc.ControllerContext controllerContext, System.Web.Mvc.ModelBindingContext bindingContext)
  { //Do model binding stuff using Json.Net }
} 

我用这条线注册了这个模型活页夹

ModelBinders.Binders.Add(typeof(List<int>), new JsonBinder());

但是 JsonBinder 永远不会被调用。为什么是这样?我应该使用 ValueProvider 吗?

4

2 回答 2

1

在 global.asax 中添加以下事件(或将代码添加到现有的 Application_BeginRequest 处理程序):

protected void Application_BeginRequest()
{
    foreach (var type in ModelBinders.Binders.Keys)
    {
        System.Diagnostics.Trace.WriteLine(
                              String.Format("Binder for '{0}': '{1}'", 
                                             type.ToString(), 
                                             ModelBinders.Binders[type].ToString()));
    }

}

然后您可以在 VS 输出窗口中检查当前注册了哪些活页夹。你可以看到这样的东西:

Binder for 'System.Web.HttpPostedFileBase': 'System.Web.Mvc.HttpPostedFileBaseModelBinder'
Binder for 'System.Byte[]': 'System.Web.Mvc.ByteArrayModelBinder'
Binder for 'System.Data.Linq.Binary': 'System.Web.Mvc.LinqBinaryModelBinder'
Binder for 'System.Threading.CancellationToken': 'System.Web.Mvc.CancellationTokenModelBinder'

您还可以检查是否有任何ModelBinderProvider可以选择活页夹提供者,因为选择使用哪个模型活页夹的顺序如下:

  1. 动作参数的属性。请参阅ControllerActionInvoker 类的 GetParameterValue 方法

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

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

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

  5. DefaultModelBinder。

使用类似的方法在 BeginRequest 事件中检查模型绑定器提供程序:

foreach (var binderprovider in ModelBinderProviders.BinderProviders)
{
    System.Diagnostics.Trace.WriteLine(String.Format("Binder for '{0}'", binderprovider.ToString()));
}

此外,您可以尝试通过 nuget 添加Glimpse,因为其中一个选项卡提供了有关用于控制器操作中每个参数的模型绑定器的信息。

希望这将帮助您跟踪未使用模型绑定器的原因。

于 2013-06-27T15:37:57.900 回答
0

您是否尝试过在操作方法中使用 ModelBinder 属性?

public ActionResult GetUsers([ModelBinder(typeof(JsonBinder))] List<int> userIds)

参考:https ://msdn.microsoft.com/en-us/library/system.web.mvc.modelbinderattribute(v=vs.118).aspx

于 2016-07-08T17:25:24.647 回答