Nancy FX在模型绑定上大写字典中的键

本文关键字:字典 FX 模型 绑定 Nancy | 更新日期: 2023-09-27 18:06:25

我试图将JSON发布到NancyFx。JSON格式如下:

{  
   "prop1": 1,
   "entries":{  
      "Entry1": 1,
      "entry2": 2
   }
}
在服务器端,我创建了一个相应的模型:
public class Model
{
    public int Prop1 { get; set; }
    public IDictionary<string, object> Entries { get; set; }
}

JSON中的entries字段具有动态结构,因此在模型中使用了IDictionary<string, object>

然后我绑定模型:

this.Bind<Model>();

模型创建成功,但问题是在Entries字典中两个键都是大写的。对我来说,情况是非常重要的,我希望第二个关键是entry2,而不是entry2。

我也尝试使用JavaScriptConverterJavaScriptPrimitiveConverter,但在Deserialize方法中,我已经大写了数据。

有什么好主意吗?

Nancy FX在模型绑定上大写字典中的键

对我来说,这是通过配置JavascriptSerializer来保留大小写来解决的。

不幸的是,我不能想出一个干净的方法来做到这一点,但这是我现在使用的hack。

    public class Model
    {
        public IDictionary<string, object> Entries { get; set; }
    }
    public class CustomModelBinder : IModelBinder
    {
        public bool CanBind(Type modelType)
        {
            return modelType == typeof(Model);
        }
        public object Bind(NancyContext context, Type modelType, object instance, BindingConfig configuration, params string[] blackList)
        {
            using (var sr = new StreamReader(context.Request.Body))
            {
                return (new JavaScriptSerializer() { RetainCasing = true }).Deserialize<Model>(sr.ReadToEnd());
            }
        }
    }

Nancy会在运行时拾取这个绑定,不需要显式地注册任何东西。

这个解决方案并不理想,因为它忽略了一些Nancy特性,如黑名单和其他可能的绑定配置设置。

一个更好的选择是从Bootstrapper中设置JsonSettings

public class MyBootstrapper : DefaultNancyBootstrapper
{
    public MyBootstrapper () : base()
    {
        JsonSettings.RetainCasing = true;
    }
}

实现IModelBinder可以工作,但是它会把其他默认的绑定设置弄乱。