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。
我也尝试使用JavaScriptConverter
和JavaScriptPrimitiveConverter
,但在Deserialize
方法中,我已经大写了数据。
有什么好主意吗?
对我来说,这是通过配置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可以工作,但是它会把其他默认的绑定设置弄乱。