C# 使用ApicController补充[FromUri]序列化

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

我们有多个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"
更改后,所有包含
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模型绑定器了吗?它解决了全局应用行为的问题。我将编辑这篇文章,删除处理示例代码的示例,这样实际答案就不会模糊。