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中的两个操作时,user
的JoinDate
属性使用我配置的自定义绑定成功绑定,但BindDateTime
的datetime
参数没有使用自定义绑定绑定。
我已经在配置中指定了所有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
,那么它就像预期的那样工作,但是为什么呢?
也很意外:)
我最初的怀疑是这一行:
GlobalConfiguration.Configuration.BindParameter(typeof(DateTime), new CurrentCultureDateTimeAPI());
MSDN说GlobalConfiguration
=> 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的约定,让它为你工作。