C# 使用ApicController补充[FromUri]序列化
我们有多个API控制器接受GET请求,如下所示:C# 使用ApicController补充[FromUri]序列化,c#,asp.net,http,asp.net-web-api,datetime-format,C#,Asp.net,Http,Asp.net Web Api,Datetime Format,我们有多个API控制器接受GET请求,如下所示: //FooController public IHttpActionResult Get([FromUri]Foo f); //BarController public IHttpActionResult Get([FromUri]Bar b); 现在-我们希望(或被迫)在GET查询字符串中更改DateTime字符串格式 "yyyy-MM-ddTHH:mm:ss" -> "yyyy-MM-ddTHH.mm.ss" 更改后,所有包含Dat
//FooController
public IHttpActionResult Get([FromUri]Foo f);
//BarController
public IHttpActionResult Get([FromUri]Bar b);
现在-我们希望(或被迫)在GET查询字符串中更改DateTime字符串格式
"yyyy-MM-ddTHH:mm:ss" -> "yyyy-MM-ddTHH.mm.ss"
更改后,所有包含DateTime
类型的类的[FromUri]
序列化都失败
有没有办法补充[FromUri]
序列化以接受查询字符串中的日期时间格式?还是我们必须为所有API参数构建自定义序列化以支持新的日期时间字符串格式
编辑:根据要求的示例
public class Foo {
public DateTime time {get; set;}
}
//FooController. Let's say route is api/foo
public IHttpActionResult Get([FromUri]Foo f);
GET api/foo?time=2017-01-01T12.00.00
要在所有模型的所有DateTime类型上应用此行为,则需要编写一个 日期时间模型活页夹
public class MyDateTimeModelBinder : IModelBinder
{
public bool BindModel(HttpActionContext actionContext, ModelBindingContext bindingContext)
{
if (bindingContext.ModelType != typeof(DateTime))
return false;
var time = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
if (time == null)
bindingContext.Model = default(DateTime);
else
bindingContext.Model = DateTime.Parse(time.AttemptedValue.Replace(".", ":"));
return true;
}
}
WebAPI配置
config.BindParameter(typeof(DateTime), new MyDateTimeModelBinder());
ss-dots是一个明显的扩展问题。好吧,但这不是重点。假设点将被替换为-如果您使用的是js,则可以在将日期时间值传递给控制器之前对其进行编码。然后控制器将对其进行解码和反序列化。@Woot不要认为问题在于编码:@supertopi对不起,您不能使用自定义参数绑定器吗?我相信这将要求所有DateTime参数都具有相同的属性名。我已经有一段时间没有写过了,但我们确实在其他属性中使用了它们。感谢您的撰写,但问题是关于全局更改序列化并使用
[FromUri]
,因为多个API参数类具有多个属性。您看到底部的DateTime模型绑定器了吗?它解决了全局应用行为的问题。我将编辑这篇文章,删除处理示例代码的示例,这样实际答案就不会模糊。