Web API模型绑定来自URI

本文关键字:URI 绑定 API 模型 Web | 更新日期: 2023-09-27 18:13:54

所以我有一个自定义的模型绑定器实现DateTime类型,我注册它如下:

void Application_Start(object sender, EventArgs e)
{
    // Code that runs on application startup
    GlobalConfiguration.Configuration.BindParameter(typeof(DateTime), new CurrentCultureDateTimeAPI());
}

,然后我设置了2个示例动作,看看我的自定义模型绑定是否发生:

    [HttpGet]
    public void BindDateTime([FromUri]DateTime datetime)
    {
        //http://localhost:26171/web/api/BindDateTime?datetime=09/12/2014
    }

    [HttpGet]
    public void BindModel([FromUri]User user)
    {
        //http://localhost:26171/web/api/BindModel?Name=ibrahim&JoinDate=09/12/2014
    }

当我运行并调用上述url中的两个操作时,userJoinDate属性使用我配置的自定义绑定成功绑定,但BindDateTimedatetime参数没有使用自定义绑定绑定。

我已经在配置中指定了所有DateTime应该使用我的自定义粘合剂,那么为什么漠不关心?建议不胜感激。

CurrentCultureDateTimeAPI.cs:

public class CurrentCultureDateTimeAPI: IModelBinder
{
    public bool BindModel(HttpActionContext actionContext, ModelBindingContext bindingContext)
    {
        var value = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
        var date = value.ConvertTo(typeof(DateTime), CultureInfo.CurrentCulture);
        bindingContext.Model = date;
        return true;
    }
}

注意:如果我使用[FromUri(Binder=typeof(CurrentCultureDateTimeAPI))]DateTime datetime,那么它就像预期的那样工作,但是为什么呢?

Web API模型绑定来自URI

也很意外:)

我最初的怀疑是这一行:

 GlobalConfiguration.Configuration.BindParameter(typeof(DateTime), new CurrentCultureDateTimeAPI());

MSDNGlobalConfiguration => GlobalConfiguration provides a global System.Web.HTTP.HttpConfiguration for ASP.NET application

但由于奇怪的原因,这似乎不适用于这个特定的场景。

在静态类WebApiConfig

中添加这一行
 config.BindParameter(typeof(DateTime), new CurrentCultureDateTimeAPI());

使您的WebAPIConfig文件看起来像:

 public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
            config.MapHttpAttributeRoutes();
            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "web/{controller}/{action}/{datetime}",
                defaults: new { controller = "API", datetime = RouteParameter.Optional }
            );
            config.BindParameter(typeof(DateTime), new CurrentCultureDateTimeAPI());
        }

一切都很好,因为这个方法是由WebAPI framework直接调用的,所以肯定你的CurrentCultureDateTimeAPI得到注册。

用你的解决方案检查了一下,效果很好。

注意:(来自注释)你仍然可以支持Attribute Routing,你不需要注释掉config.MapHttpAttributeRoutes()这一行。

但是,如果有人能告诉我为什么GlobalConfiguration不工作

看起来您想要向服务器发布一些数据。尝试使用FromData和post JSON。FromUri通常用于获取一些数据。使用WebAPI的约定,让它为你工作。