gpt4 book ai didi

c# - 来自 URI 的 Web API 模型绑定(bind)

转载 作者:可可西里 更新时间:2023-11-01 08:50:07 27 4
gpt4 key购买 nike

所以我有一个为 DateTime 类型实现的自定义 Model Binder,我像下面这样注册它:

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

然后我设置了 2 个示例操作以查看我的自定义模型绑定(bind)是否发生:

    [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 属性使用我配置的自定义绑定(bind)器成功绑定(bind),但 BindDateTimedatetime 参数未使用自定义 Binder 进行绑定(bind)。

我已经在配置中指定所有 DateTime 都应该使用我的自定义 Binder ,那么为什么没有区别呢?非常感谢您的建议。

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());

MSDNGlobalConfiguration => GlobalConfiguration 为 ASP.NET 应用程序提供全局 System.Web.HTTP.HttpConfiguration

但出于奇怪的原因,这似乎不适用于这种特定情况。

所以,

只需在静态类 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 框架 直接调用,因此可以确保您的 CurrentCultureDateTimeAPI 已注册。

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

注意:(来自评论)您仍然可以支持Attribute Routing,并且您不需要注释掉这一行config.MapHttpAttributeRoutes() .

但是,如果有人能说出为什么 GlobalConfiguration 无法正常工作,那就太好了

关于c# - 来自 URI 的 Web API 模型绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24844830/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com