Geo*_*uer 6 model-binding asp.net-web-api
我有以下行动签名
[ValidateInput(false)]
public HttpResponseMessage PostParam(Param param)
Run Code Online (Sandbox Code Playgroud)
Param看起来像这样:
public class Param {
public int Id { get; set;}
public string Name { get; set; }
public string Choices { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
这就是故障 - 电线上的内容是这样的
{
Id: 2,
Name: "blah",
Choices: [
{
foo: "bar"
},
{
blah: "blo"
something: 123
}
]
}
Run Code Online (Sandbox Code Playgroud)
我不希望"选择"反序列化 - 我希望它存储为字符串(是的,我理解安全隐患).可以理解,我收到一个错误,因为默认的绑定器不知道这个.
现在使用Asp Mvc创建一个特定的ModelBinder会相当简单.ID
Application_Start使用中设置活页夹Binders.Add看起来像Web Api这是一个不同的过程 - System.Web.DefaultModelBinder没有任何要覆盖的东西,我无法使用它Binders.Add.我试过环顾四周但却找不到如何实际做我想做的事情.这更加复杂,因为显然ModelBinders api在Beta和RTM上发生了相当大的变化,因此有很多过时的信息.
Fil*_*p W 19
在网页API,你必须区分三个概念- ModelBinding,Formatters和ParameterBinding.对于从MVC转移到MVC的人来说,这是非常令人困惑的,我们只讨论这个问题ModelBinding.
ModelBinding与MVC相反,仅负责从URI中提取数据.格式化程序处理读取正文,ParameterBinding(HttpParameterBinding)包含前两个概念.
ParameterBinding 当你想要彻底改变整个机制(即允许两个对象从body绑定,实现MVC样式绑定等)时,它真的很有用 - 用于修改绑定器(用于URI特定数据)或格式化器(用于正文数据)的简单任务)几乎总是绰绰有余.
无论如何,关键 - 您可以使用自定义JSON.NET转换器轻松完成您想要实现的目标(JSON.NET是Web API JSON格式引擎背后的默认序列化库).
你需要做的就是:
public class Param
{
public int Id { get; set; }
public string Name { get; set; }
[JsonConverter(typeof(CustomArrayConverter))]
public string Choices { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
然后添加转换器:
internal class CustomArrayConverter : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return true;
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue,
JsonSerializer serializer)
{
var array = JArray.Load(reader);
return JsonConvert.SerializeObject(array);
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
serializer.Serialize(writer, JArray.Parse(value as string));
}
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我们告诉转换器中的JSON.NET存储Choices为string(在read方法中),当您将Param具有该Choices属性的对象返回给客户端时(在write方法中),我们将string并序列化为一个,array以便输出JSON看起来与输入的相同.
您可以像这样测试它:
public Param PostParam(Param param)
{
return param;
}
Run Code Online (Sandbox Code Playgroud)
并验证进入的数据是否符合您的要求,并且输出的数据与原始JSON相同.
| 归档时间: |
|
| 查看次数: |
3298 次 |
| 最近记录: |